8 мар. 2011 г.

Serialization graph

Стандартная сериализация в java обладает рядом недостатков (см. Effective Java 2nd edition, автор Josh Bloch стр. 289), среди которых: медленная сериалазиция (см. jvm-serializers benchmarks) и сохранение полного графа объектов.
Однако, идея сохранения графа имеет и положительный аспект.

Вкратце, процесс стандартной сериализации графа объекта выглядит так:

Заголовок пакета содержит только описания классов без их свойств (можно назвать «словарь объектов»).
При этом в сериализованном виде объекты представлены как ссылки (возможно, на не до конца проинициализированные объекты).
Процесс десериализации создаёт карту объектов на основе «словаря объектов» , которые в последствии заполняет свойствами-примитивами (boolean, int, long и т.п) и в т.ч. и ссылками на объекты из «словаря объектов».

Т.о. стандарная сериализация позволяет разрешать циклические зависимости, а так же избегать повторов сериализации объектов в потоке.

В противовес медленной сериализации, обратной совместимости, контролю сериализованного графа и т.п часто ставят «ручную» сериалализацию, например, используя java.io.Externalizable.

Часто при передаче, н-р массива объектов, встречаются повторяющиеся объекты (как правило строки, но не только), т.е

Введя понятие «словаря объектов» (или словаря строк) можно добиться уменьшения объёма пакета без существенных доп. нагрузок.

ps. на моём примере при сериализации около 200 объектов выигрыш составил ~ 50%.

Комментариев нет: