2015-08-21 4 views
1

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

Однако каждый узел интересуется только одной или несколькими, как правило, небольшими частями всего объекта. Процессорный узел обрабатывает эту часть и создает новую часть, которая должна быть подключена к существующему сериализованному объекту до его отправки.

Для этого две вещи будут иметь большое значение:

  • будучи в состоянии только десериализации части сериализованного объекта (и, таким образом, сохранить разборе/время десериализации, время создания объекта, память ...) и также добавить сериализацию какой-либо новой части к существующему сериализованному объекту (снова экономя время и память). Пропуск нежелательных частей в сериализованной версии должен быть чрезвычайно быстрым и эффективным и в идеале должен быть возможен в потоковом режиме без необходимости чтобы сохранить все последовательные данные в памяти сразу
  • полная компактная и быстрая сериализация и десериализация.

Я довольно гибко отношусь к тому, насколько автоматизирован процесс создания типизированных объектов по сравнению с нетипизированными картами и списками: если все остальное не получится, я смог бы представить весь объект в виде вложенной структуры данных только для карт, массивы и базовые типы данных boolean, String и Number.

ОБНОВЛЕНИЕ: забыл упомянуть два дополнительных, весьма важных требований:

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

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

+3

Можно ли разложить сложный объект на части и сериализовать отдельные части? –

+0

Вы изучали экстернализацию? –

+0

Существует несколько библиотек, которые позволяют вам использовать сериализованные объекты для извлечения или обновления только интересующих вас полей. Chronicle Byte/Wire, SBE, Javolution struct. –

ответ

0

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

Почему бы не иметь хост, у которого есть все данные, выяснить, какой узел нуждается в данных и отправлять только эти данные? Тогда обработка может происходить параллельно, а не в цепочке. И ваш общий сетевой трафик будет меньше, чем каждый узел, отправляющий полную копию всего: O (n * m).

Возможно, стоит разработать собственный формат сообщений, основанный на JSON, двоичном или другом.

+0

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

+0

@Johsm: хм. IDK, что предложить, если вы действительно хотите использовать стандартную сериализацию/десериализацию, за исключением дополнительной поездки туда и обратно: сервер сообщает узлу, что ему нужно для узла. Узел запрашивает определенную часть набора данных. Сервер отправляет его и т. Д. И т. Д. –

+0

TBH Я бы подумал, что требование рассматривать только часть сериализованного объекта было бы более распространенным, чтобы стандартное решение существовало. Если нет, я соглашусь приготовить свое собственное, но было бы жаль изобретать существующее колесо. – Johsm

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