Альтернатива protobuf-net - размерно-временный сериализатор для работы с графом объектов - PullRequest
11 голосов
/ 20 октября 2011

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

В .NET реализовано мало идей Google. (т.е. protobuf-csharp-port , или protosharp ), но наиболее интересным является protobuf-net .

Protobuf-net лучше, потому что его архитектура соответствует миру .NET, а имеет несколько надстроек (не всегда совместимых с оригинальным protobuf, но очень полезных).

Одной из таких надстроек является возможность включить отслеживание ссылок (опция AsReference), которая позволяет сериализовать сложные графики даже с циклами.

Ненужный Protobuf-net v2 находится в бета-версии, а Опция AsReference не работает в реальных сценариях . (без этой опции все работает хорошо, но без Reference Tracikng protobuf-net не может сериализовать графики и больше не является привлекательным сериализатором).

В ней все еще есть некоторые ошибки:

Итак, я не могу использовать этот замечательный инструмент, и я ищу альтернативный сериализатор, который:

  • , по крайней мере, так же быстро, и производит маленький вывод как protobuf
  • легко адаптировать к текущему проекту, например protobuf-net
  • позволяет сериализовать граф как DataContractSerializer с PreserveObjectReferences, установленным в true
  • стабильно не только для простых объектов, но и для сложных сценариев реального мира

Ответы [ 3 ]

7 голосов
/ 20 сентября 2013

Bartosz, хотя этот вопрос довольно старый, я мог бы порекомендовать вам и всем, кто сталкивается с ним, использовать Migrant , доступный как из источника, так и из пакета NuGet .Я один из соавторов.

Это может быть легко адаптировано даже к сложным сценариям, мы постарались сделать его максимально простым в использовании.

Размер вывода достаточно мал,Конечно, это зависит от вашего дерева объектов, но может быть сравнимо с protobuf-net.Как и protobuf, он использует кодировку Varint и ZigZag.

Конечно, Migrant решает проблемы, о которых вы упомянули - он хранит целые графики объектов, обрабатывает наследование, сложные коллекции, допустимость версий (до некоторой степени) и т. Д.

В терминахПо скорости мы стараемся быть сравнимыми с protobuf-net.Он поддерживает де-сериализацию с использованием динамически генерируемых методов, что намного быстрее, чем классические решения, основанные на отражениях.

Простые сценарии использования доступны на сайте, на который я ссылаюсь, но простое клонирование объектов не вызывает затруднений.

var myComplexObject = new MyComplexType(complexParameters);
var myObjectCopy = serializer.DeepClone(myComplexObject);

Запись в поток так же проста.

Конечно, для очень сложных типов существует набор декораторов классов (атрибутов, хуков), которые делают вещи еще умнее ;-)

1 голос
/ 20 октября 2011

Мы рассматриваем MessagePack . Они утверждают, что в 4 раза быстрее, чем ProtoBuf. Однако я не знаю, поддерживает ли он полные графы объектов. (у нас нет этого требования, мы фактически выравниваем объекты, которые используем для связи) В моем сценарии я бы использовал его для связи между .Net и слоем delphi (и это также то, что сдерживает меня, никакой поддержки delphi :))

0 голосов
/ 13 марта 2016

Может быть уже поздно ответить на этот конкретный вопрос, но я опубликую его здесь для тех, кто может искать то же самое, потому что отслеживание ссылок все еще не работает в protobuf-net.

Вы можете использоватьвилка: AqlaSerializer .Он имеет гораздо больше улучшений, чем просто отслеживание ссылок:

  • Вложенные коллекции
  • Многомерные массивы
  • Очень гибкое и расширяемое отображение

и многие другие.

Отказ от ответственности: я его автор.

...