|
|
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть cериализованный класс Model на северной стороне который содержит некоторые поля: Код: java 1. Есть объект класса ArrayList. В цикле создается экземпляр класса Model заполняются его поля и добавляется в ArrayList. Создаем экземпляр класса ObjectOutputStream и записываем объект класса ArrayList в поток методом writeObject() посылаем клиенту. На другой стороне клиент ловит этот массив при помощи метода readObject класса ObjectInputStream и в этот момент возникнет исключительная ситуация, а именно java.lang.ClassNotFoundException: _a_inventoryServer.Model. Я понял, что клиент не может найти класс Model который находить на стороне сервера. Как поступить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 12:28:56 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
Для дружбы клиента и сервера есть протоколы RMI, SOAP e.t.c. А сериализация это немножко другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 12:34:55 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
Любое общение предположений предполагает некоторый протокол из взаимодействия. Serializable - это один из таких протоколов. У этого протокола есть требование: все сериализиуемые классы должны быть как на отправляющей, так и на принимающей стороне. Поэтому, если вы хотите оставаться в рамках Serializable/Externalizable, то вы обязаны выполнить это требование. Например, вынести все передаваемые кастомные классы в отдельный джарник. Это нормальная практика. Если это требование по каким-то причнам невыполнимо, то вам надо использовать другой протокол взаимодействия. Например: 1) Обычный TCP с вашим собственным протоколом. То есть вы берете ваш объект, проходитесь по его полям и каким-то образом записываете их в какой-нибудь DataOutputStream. А принимающая сторона делает симметричные действия по чтению в своем DataInputStream'е. Это похоже не Externalizable, но не требует наличия соответствующего класса на принимающей стороне. 2) Можно уйти с TCP на прикладной уровень, и заворачивать все это дело в HTTP. 3) Можно посмотреть в сторону какого-нибудь Hessian. Минус этих подходов: много ручной работы. Плюс: принимающей стороне не нужны никакие сторонние классы. 4) Остаться при Serializable/Externalizable или другой механимз сериализации (вроде Kryo), и поставить принимающей стороне недостающие классы. 5) Использовать RMI, и поставить принимающей стороне классы-скелетоны. 6) Использовать SOAP, и сгенерировать не принимающей стороне классы-скелетоны. Плюс этих подходов: мало ручной работы. Минус: принимающей стороне нужны сторонние классы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 13:01:43 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 13:13:00 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
cdtyjv5) Использовать RMI, и поставить принимающей стороне классы-скелетоны. RMI умеет загружать классы вместе с данными, классы-скелетоны на клиенте не обязательны (dynamic class loading). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 14:46:52 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
МужикRMI умеет загружать классы вместе с данными, классы-скелетоны на клиенте не обязательны (dynamic class loading).Это не решает проблему. Вы можете загружать класс в runtime. Ну а как вы будете работать с объектами этих классов? Через reflection? То еще удовольствие. Поэтому вам как минимум нужно иметь на принимающей стороне интерфейс, который загружаемый класс имплементирует, что все равно приводит нас к тому факту, что какую-то часть классов необходимо перенести с "отправителя" на "приемник" руками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 15:01:09 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
Да. Приёмник не может принять голый Object. Он в любом случае должен делать кастинг к какому-то известному интерфейсу о котором "договорились" клиент и сервер. Иначе такая посылка безсмысленна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 15:14:37 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
cdtyjvВы можете загружать класс в runtime. Ну а как вы будете работать с объектами этих классов? Через reflection? То еще удовольствие. Автор указал только на одну проблему -- ClassNotFoundException. Значит, с самими классами на клиенте он точно не работает. Может он их там в XML или еще куда преобразует или через JavaScript, например, с ними работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 21:36:06 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
МужикАвтор указал только на одну проблему -- ClassNotFoundException. Значит, с самими классами на клиенте он точно не работает. Может он их там в XML или еще куда преобразует или через JavaScript, например, с ними работает.Ну давайте не будем строить догадок, что там делает автор. Ему виднее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 21:40:07 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
cdtyjvНу давайте не будем строить догадок, что там делает автор. Ему виднее. Вот именно. Поэтому я и предложил решение, исходя только из того, что было в вопросе. У меня, например, была задача, где клиенту совсем были не нужны классы объектов, отдаваемые по RMI, потому что вся логика клиента была на scripting-движке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 21:43:47 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
cdtyjv4) Остаться при Serializable/Externalizable или другой механимз сериализации (вроде Kryo), и поставить принимающей стороне недостающие классы. Пробую разобраться. На принимающей стороне создал такой же класс : Код: java 1. Далее создаю ArrayList для приема объекта с сервера. Код: java 1. И читаю из потока Код: java 1. Ошибка таже ... подскажите пожалуйста как с этим механизмом правильно работать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 08:21:06 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
TimRX , В том же пакете создали? Внутренности классов совпадают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 08:26:29 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
А если в разных пакетах .. то такой механизм не отработает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 08:28:15 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
cdtyjvВ том же пакете создали? Внутренности классов совпадают? Клиент и сервер находятся в разных пакетах. Классы Model абсолютно идентичны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 09:25:41 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
TimRXКлиент и сервер находятся в разных пакетах. Классы Model абсолютно идентичны. И смысл такого хода конём? Почему бы не завести общий пакет для сервера и клиента (тех классов что совпадают)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 09:59:47 |
|
||
|
Передача List по сети.
|
|||
|---|---|---|---|
|
#18+
TimRXА если в разных пакетах .. то такой механизм не отработает ?Ну а как он может работать? При сериализации объекта в стрим записывается его описание, так как в противном случае вы на принимающей стороне не будете понимать, что вам пришло. Рекомендую почитать про то, что именно Java пишет ObjectOutputStream, тогда вопросы подобного рода отпадут сами собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 10:06:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38421128&tid=2128461]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
196ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 522ms |

| 0 / 0 |
