Альтернатива 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. У него гораздо больше улучшений, чем просто работающее отслеживание ссылок:
- Вложенные коллекции
- Многомерные массивы
- Очень гибкое и расширяемое отображение
и многие другие.
Отказ от ответственности: я автор его.