2010-06-26 2 views

ответ

8

Самый простой способ, вероятно, использовать serialization. Таким образом, ваши классы объектов должны реализовывать сериализуемые, поэтому все члены (примитивы и большинство стандартных классов Java уже делают это). Это позволяет сопоставлять между экземплярами объектов и потоками байтов во время выполнения.

Вам также нужен протокол для трансивера. Вы можете взглянуть на RMI, если вы не хотите иметь дело с потоковой передачей потоков байтов через провод, хотя это не так сложно. Использование RMI позволяет впоследствии создавать более мощные распределенные приложения Java.

+0

Я ищу помощь с потоковыми байтовыми потоками по проводу. Можете ли вы предоставить некоторые рекомендации? – Jus12

+0

RMI является старым и не может иметь дело с Callbacks с NAT в системе – user3224416

7

ObjectOutputStream/ObjectInputStream.

Вся логика примерно следующая. Отрегулируйте требования вашего приложения.

Отправить:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(objectToSend); 
oos.close(); 

byte[] bytes = baos.toByteArray(); 
socket.write(bytes); 

Прием:

ObjectInputStream ois = new ObjectInputStream(socketInputStream); 
MyObject mo = (MyObject)ois.readObject(); 
+1

Есть ли причина, по которой вы записываете данные в ByteArrayOutputStream, а не непосредственно в SocketOutputStream? – meriton

+1

Нет особых причин. Просто я обычно разделяю сериализацию и отправку/хранение/хранение в части db, поэтому я передаю байты []. Как я упоминал в другом ответе, сериализованные данные могут быть не единственной частью сообщения; Я могу добавить подпись, маршрутизацию, все, что требуется логикой –

3

Это зависит:

Если другая конечная точка находится в Java, то сериализация может быть самым быстрым способом реализации. Но примечание, поддерживающее Java Serialization, не является тривиальной задачей и может быть тяжелой задачей для поддержания с течением времени. Для некоторых примеров просто Google «Java serialization gotchas».

Если другая конечная точка не находится в Java или будущей ремонтопригодности, а совместимость является целью, то я бы рекомендовал более общую кодировку многократного использования. Для этого я бы посмотрел Google Protocol Buffers или Apache Thrift (могу опубликовать только 1 гиперссылку).

Конечно, всегда существует возможность использования XML для кодирования ваших объектов. :)

Лично в наших проектах мы используем буферы протокола Google и, на мой взгляд, не могут быть избиты для удобства использования, ремонтопригодности и, самое главное, в нашем случае совместимости версий протокола Buffer.

0

Если вы находитесь в многоплатформенной среде, вы можете использовать CORBA. Хотя это немного сложно, потому что вам может потребоваться контролировать обе конечные точки и реализовать привязки интерфейса определения интерфейса (IDL).

Хорошая альтернатива использует JSON. Вам просто нужно сопоставить структуру JSON с вашими Java-объектами.

Смежные вопросы