powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача List по сети.
17 сообщений из 17, страница 1 из 1
Передача List по сети.
    #38420048
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.


Есть cериализованный класс Model на северной стороне который содержит некоторые поля:
Код: java
1.
public class Model implements Serializable



Есть объект класса ArrayList. В цикле создается экземпляр класса Model заполняются его поля и добавляется в ArrayList.
Создаем экземпляр класса ObjectOutputStream и записываем объект класса ArrayList в поток методом writeObject() посылаем клиенту.

На другой стороне клиент ловит этот массив при помощи метода readObject класса ObjectInputStream и в этот момент возникнет исключительная ситуация, а именно java.lang.ClassNotFoundException: _a_inventoryServer.Model.

Я понял, что клиент не может найти класс Model который находить на стороне сервера. Как поступить ?
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420062
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для дружбы клиента и сервера есть протоколы RMI, SOAP e.t.c. А сериализация это немножко другое.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420117
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любое общение предположений предполагает некоторый протокол из взаимодействия.
Serializable - это один из таких протоколов. У этого протокола есть требование: все сериализиуемые классы должны быть как на отправляющей, так и на принимающей стороне. Поэтому, если вы хотите оставаться в рамках Serializable/Externalizable, то вы обязаны выполнить это требование. Например, вынести все передаваемые кастомные классы в отдельный джарник. Это нормальная практика.
Если это требование по каким-то причнам невыполнимо, то вам надо использовать другой протокол взаимодействия. Например:
1) Обычный TCP с вашим собственным протоколом. То есть вы берете ваш объект, проходитесь по его полям и каким-то образом записываете их в какой-нибудь DataOutputStream. А принимающая сторона делает симметричные действия по чтению в своем DataInputStream'е. Это похоже не Externalizable, но не требует наличия соответствующего класса на принимающей стороне.
2) Можно уйти с TCP на прикладной уровень, и заворачивать все это дело в HTTP.
3) Можно посмотреть в сторону какого-нибудь Hessian.
Минус этих подходов: много ручной работы. Плюс: принимающей стороне не нужны никакие сторонние классы.

4) Остаться при Serializable/Externalizable или другой механимз сериализации (вроде Kryo), и поставить принимающей стороне недостающие классы.
5) Использовать RMI, и поставить принимающей стороне классы-скелетоны.
6) Использовать SOAP, и сгенерировать не принимающей стороне классы-скелетоны.
Плюс этих подходов: мало ручной работы. Минус: принимающей стороне нужны сторонние классы.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420147
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420365
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv5) Использовать RMI, и поставить принимающей стороне классы-скелетоны.
RMI умеет загружать классы вместе с данными, классы-скелетоны на клиенте не обязательны (dynamic class loading).
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420404
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикRMI умеет загружать классы вместе с данными, классы-скелетоны на клиенте не обязательны (dynamic class loading).Это не решает проблему. Вы можете загружать класс в runtime. Ну а как вы будете работать с объектами этих классов? Через reflection? То еще удовольствие.
Поэтому вам как минимум нужно иметь на принимающей стороне интерфейс, который загружаемый класс имплементирует, что все равно приводит нас к тому факту, что какую-то часть классов необходимо перенести с "отправителя" на "приемник" руками.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420431
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Приёмник не может принять голый Object. Он в любом случае должен делать кастинг
к какому-то известному интерфейсу о котором "договорились" клиент и сервер. Иначе
такая посылка безсмысленна.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420899
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvВы можете загружать класс в runtime. Ну а как вы будете работать с объектами этих классов? Через reflection? То еще удовольствие.
Автор указал только на одну проблему -- ClassNotFoundException. Значит, с самими классами на клиенте он точно не работает. Может он их там в XML или еще куда преобразует или через JavaScript, например, с ними работает.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420904
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикАвтор указал только на одну проблему -- ClassNotFoundException. Значит, с самими классами на клиенте он точно не работает. Может он их там в XML или еще куда преобразует или через JavaScript, например, с ними работает.Ну давайте не будем строить догадок, что там делает автор. Ему виднее.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38420906
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНу давайте не будем строить догадок, что там делает автор. Ему виднее.
Вот именно. Поэтому я и предложил решение, исходя только из того, что было в вопросе. У меня, например, была задача, где клиенту совсем были не нужны классы объектов, отдаваемые по RMI, потому что вся логика клиента была на scripting-движке.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421052
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv4) Остаться при Serializable/Externalizable или другой механимз сериализации (вроде Kryo), и поставить принимающей стороне недостающие классы.


Пробую разобраться.

На принимающей стороне создал такой же класс :
Код: java
1.
public class Model implements Serializable



Далее создаю ArrayList для приема объекта с сервера.
Код: java
1.
List<Model> valuesO&#8203;fRegistryBranches = new ArrayList<Model>();


И читаю из потока
Код: java
1.
valuesO&#8203;fRegistryBranches = (List<Model>) in.readObject();



Ошибка таже ... подскажите пожалуйста как с этим механизмом правильно работать ?
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421053
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRX ,
В том же пакете создали? Внутренности классов совпадают?
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421054
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если в разных пакетах .. то такой механизм не отработает ?
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421096
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvВ том же пакете создали? Внутренности классов совпадают?

Клиент и сервер находятся в разных пакетах. Классы Model абсолютно идентичны.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421128
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRXКлиент и сервер находятся в разных пакетах. Классы Model абсолютно идентичны.
И смысл такого хода конём? Почему бы не завести общий пакет для сервера и клиента (тех классов что совпадают)?
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421136
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRXА если в разных пакетах .. то такой механизм не отработает ?Ну а как он может работать? При сериализации объекта в стрим записывается его описание, так как в противном случае вы на принимающей стороне не будете понимать, что вам пришло.
Рекомендую почитать про то, что именно Java пишет ObjectOutputStream, тогда вопросы подобного рода отпадут сами собой.
...
Рейтинг: 0 / 0
Передача List по сети.
    #38421472
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Вынес общие классы в отдельный пакет и все заработало.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача List по сети.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]