Плюсы и минусы использования ObjectInputStream / ObjectOutputStream для реализации сетевых «пакетов» в Java? - PullRequest
2 голосов
/ 14 августа 2011

Я работаю над простым клиент-серверным приложением, которое использует сокеты для всех коммуникаций.Коммуникации основаны на пакетах, и концепция пакетов реализована с использованием набора классов и оболочки ObjectInputStream / ObjectOutputStream для потоков сокетов.

Интересно, имеет ли этот подход какие-либо недостатки по сравнению с полностью текстовымиоснованный на протоколе (например, IRC) или "очень бинарный" материал, где я явно работаю с байтами.

Давайте проигнорируем здесь проблемы с трафиком ("qwerty" против "qwerty" + 1 КБ метаданных) и рассмотрим только надежностьремонтопригодность.

Как вы думаете?

Ответы [ 2 ]

5 голосов
/ 14 августа 2011

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

Это не проблема, если:

  • Вы можете гарантировать, что все ваши клиенты / серверы будут работать с одной и той же версией вашего кода.
  • Вам никогда не нужно читать данные, которые были написаны предыдущей версией.

Может быть, это ваша ситуация, но лично я предпочитаю формат сериализации, который позволяет мне быть более гибким с версионированием.Теперь это не требует, чтобы он был двоичным или текстовым, конечно.Вы можете использовать JSON, протокол буфера , Thrift или любое количество других опций.У каждого будут свои плюсы и минусы - но, скорее всего, каждый будет спроектирован с учетом более простой совместимости версий, чем Java.

Теперь плюс сериализации Java заключается в том, что пока вы находитесь вВ ситуации, когда все работает (все дерево можно сериализовать), вы можете просто сериализовать его без каких-либо других изменений - вам не нужно отдельно моделировать ваши данные, как это происходит в некоторых средах сериализации.К сожалению, как только вы захотите использовать класс, который не сериализуемый где-то в вашем дереве, вы снова почувствуете боль ...

Что касается выбора между текстовым и бинарнымформы - плюсы и минусы разумно очевидны.Текст больше, но проще диагностировать происходящее, просто взглянув на следы сети.Конечно, вам нужно убедиться, что вы используете одну и ту же кодировку с обеих сторон.

О, и, конечно, если вы когда-нибудь захотите общаться с не-Java клиент-сервером, вам будет трудноесли вы использовали собственную сериализацию Java:)

2 голосов
/ 14 августа 2011

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

Я бы вместо этого использовал что-то вроде буферов протокола.

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