Целостность ссылок в BinaryFormatter

Существование опции AsReference в Protobuf-net и слова о том, что BinaryFormatter является «сериализатором графов», наводят меня на мысль, что BinaryFormatter не поддерживает ссылки и делает копию каждого объекта.

Но я провел несколько тестов и обнаружил, что все ссылки в одном вызове BinaryFormatter Serialize() или Deserialize() сохраняются даже для рекурсивных ссылок.

Могу ли я подтвердить, что BinaryFormatter действительно поддерживает ссылки? Чем это отличается от Protobuf-net? Кажется, я неправильно понимаю "сериализацию графа"? На что еще я должен обратить внимание?

Заранее спасибо.


person Jake    schedule 20.09.2011    source источник


Ответы (1)


тл;др; версия - BinaryFormatter всегда сохраняет ссылки.

Тот факт, что BinaryFormatter является "сериализатором графа", является синонимом "он сохраняет ссылки", поскольку это требуется для точного воспроизведения графа. Альтернативой является сериализатор tree (который является большинством из них; XmlSerializer, DataContractSerializer (без включенной конкретной опции), JavascriptSerializer и protobuf-net. без AsReference все основаны на дереве). Сериализаторы деревьев не обычно не сохраняют ссылки (если только они не работают с некоторыми трюками, например, что делает DataContractSerializer, если вы включаете полнографовый режим, или protobuf-net делает с AsReference). Сериализаторы дерева (без включенного вуду) имеют тенденцию взрываться в беспорядке с рекурсивной моделью, что облегчает их обнаружение.

person Marc Gravell    schedule 20.09.2011