Альтернатива protobuf-net - размеру и эффективному по времени сериализатору для работы с графом объектов

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

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

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

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

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

У него все еще есть некоторые ошибки:

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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