Сериализация Java, Kryo и граф объектов
допустим у меня есть массив arr
объектов типа A
в памяти, каждый из которых имеет поле для ссылок, указывающих на один и тот же объект B
.
иллюстрации:
A_1 A_2 A_3 ... A_N
| | | |
| | V |
--->--> B <-----/
обратите внимание, что поле ссылки в каждом объекте типа A
указывает то же самое
1 ответов
http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html
механизм сериализации по умолчанию для объекта, пишет класс объект, сигнатура класса и значения всех нестационарных и нестатические поля. Ссылки на другие объекты (кроме переходные или статические поля) также вызывают запись этих объектов. несколько ссылок на один объект кодируются с помощью ссылки разделение механизм, позволяющий восстанавливать графики объектов в такой же формы, как и в оригинале.
Что касается моего понимания спецификации, вы получаете ссылки на общие объекты, если экземпляры объектов, которые будут совместно использоваться, проходят через тот же ObjectOutputStream.
поэтому, когда вы сериализуете класс, содержащий arr
array, каждый записанный объект получает ID, и для каждой ссылки, которая проходит через поток, записывается только этот ID. Этот десериализованный граф в этом случае остается однородным с исходным графом.
мне жаль, но я не могу помочь с собственным механизмом сериализации библиотеки krio, я был бы очень рад узнать от кого-то, кто его использовал.
редактировать о kryo:
некоторая документация, которую я нашел:
по умолчанию каждый внешний вид объекта на графике после первого сохраняется как целочисленный порядковый номер. Это позволяет несколько ссылок на одно и то же объект и циклические графы для сериализации. Это имеет небольшое количество накладных расходов и может быть отключено для экономии места, если это не требуется:
kryo.setReferences(false);
этой (github)-это контракт опорного преобразователя; даны две реализации: ArrayList-based для графов малых объектов, Map-based для больших
этой является реализацией массива объектов по умолчанию (де)сериализатор
классы должны быть зарегистрированы для (de)сериализации; каждый зарегистрированный класс может быть связан с сериализатором (среди которых, сериализация Java по умолчанию )