Передача объектов как часть запроса SOAP и получение объектов обратно как ответ .... с использованием веб-сервисов - PullRequest
2 голосов
/ 18 октября 2008

У меня есть веб-сервис, который принимает объекты java.lang.object в качестве параметров (потому что во время выполнения знает только тип объекта) ... после выполнения процесса ответьте установкой ответа java.lang.Object.

Я могу отправить объекты reuest на веб-сервис из вызывающей программы, но получаю исключение NotSerializable при создании ответа от веб-сервиса.

Я узнал, что «если мы реализуем java.io.serializable, механизмы также должны быть сериализуемыми объектами» ... здесь Object не является сериализуемым объектом ... он не реализует Serializable ....

Если бы кто-нибудь мог направить mw с правильным решением ... Я был бы благодарен.

Спасибо Bhaskar

Ответы [ 4 ]

3 голосов
/ 18 октября 2008

У меня есть веб-сервис, который принимает java.lang.object объекты в качестве параметров (потому что во время выполнения знаю только тип объекта)

Эта часть меня беспокоит. Незнание типа во время программирования является запахом кода. Если вы не знаете, что это такое, как вы можете сделать код для его обработки?

Может быть законная причина сделать то, что вы пытаетесь достичь, но обычно есть лучший способ. Реальный вопрос здесь может быть следующим: «Как мне спроектировать свой веб-сервис и код для удовлетворения моих требований?»

Когда метод принимает «Объект» или другие чрезвычайно общие типы, они часто содержат переключающую структуру, которая проверяет определенные типы и обрабатывает их по-разному, а «неизвестные» типы либо генерируют исключение, либо (что еще хуже) могут просто быть проигнорированным Решение здесь, вероятно, заключается в создании нового метода для каждого типа. И на самом деле не имеет значения, является ли это просто обычный метод Java или веб-сервисом.

1 голос
/ 18 октября 2008

Сериализует объект в байтовый массив и возвращает его в вашем вызове SOAP, затем маршаллизирует объект обратно из байтового массива в клиенте. SOAP может легко и эффективно обрабатывать байтовые массивы, а сериализация будет деталью реализации, выходящей за рамки транзакции SOAP.

1 голос
/ 18 октября 2008

Чтобы решить вашу непосредственную проблему, вы должны принять «Сериализуемый» вместо «Объект». Тогда вам нужно сделать ваш класс сериализуемым. Если вы не можете этого сделать, вы никогда не сможете перенести объект через веб-сервис.

Это ядро, которое вы должны понимать: Если оно может быть передано через веб-сервис, это означает, что его можно сериализовать. Если возможно сериализовать его, можно сделать его сериализуемым.

Если вы не можете изменить сам класс, вы можете обойти эту проблему. Например, вы можете создать новый класс Serializable, который может читать всю необходимую информацию из вашего объекта.

Сказать, что всем членам класса Serializable тоже нужен Serializable, - не полная правда. Все необходимые данные должны быть сериализуемыми, но сами классы не должны реализовывать интерфейс Serializable.

Альтернативой является реализация этих двух методов:

private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, classNotFoundException;

Здесь есть статья о сериализации: Раскройте секреты Java Serialization API

В нем описывается, как использовать эти два метода в разделе «Настройка протокола по умолчанию».

Если это недостаточно продвинуто, прочитайте в разделе «Создание собственного протокола: интерфейс с возможностью внешнего подключения», чтобы узнать, как реализовать интерфейс с внешним интерфейсом (подынтерфейс для Serializable), который дает вам полный контроль над процессом сериализации.

(Я игнорирую «временную» функцию для простого игнорирования несериализуемых данных, поскольку полагаю, что они вам нужны. Если мое предположение неверно, прочитайте раздел «Несериализуемые объекты».)

0 голосов
/ 18 октября 2008

Если члены класса не реализуют Serializable, вы не можете использовать для этого нативную сериализацию Java. Это в основном то, что говорит вам ваше сообщение об ошибке.

Если вы не можете заставить базовые объекты реализовать Serializable, то вам, вероятно, придется найти другой метод сериализации для входа и выхода из вашего веб-сервиса. Популярными разновидностями Java являются XML, JSON, AMF, хотя вы всегда можете свернуть свои собственные.

Если у вас есть объекты Java на обоих концах вашего запроса, убедитесь, что вы учитываете код так, чтобы ваш код сериализации и десериализации находился в библиотеке, которую можно использовать на обоих концах. Это значительно облегчит бремя тестирования в вашей реализации.

Я бы рекомендовал хранить весь код сериализации вне самих объектов домена. Подумайте об использовании фабричного шаблона для создания ваших объектов.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...