protobuf-net的替代方案 - 用于处理对象图的大小和时间有效的序列化程序

时间:2011-10-20 09:49:35

标签: .net serialization protocol-buffers protobuf-net datacontractserializer

Google protobuf是高效序列化对象的绝佳协议,但只有支持树的序列化,而不支持图(缺少完整的对象参考跟踪)。

在.NET中实现Google的想法很少。 (即protobuf-csharp-portprotosharp),但最有趣的是protobuf-net

Protobuf-net更好,因为它的架构适合.NET世界,有几个插件(并不总是与原始protobuf兼容,但非常有用)。

其中一个加载项是打开引用跟踪(AsReference选项)的可能性,它允许甚至在循环时序列化复杂的图形。

不必要的Protobuf-net v2处于测试阶段, AsReference选项无法在真实场景中使用。 (没有这个选项一切都运行良好,但没有Reference Tracikng protobuf-net无法序列化图形,也不再具有吸引力的序列化程序)。

它仍有一些错误:

所以,我不能使用这个伟大的工具,我正在寻找替代的序列化器:

  • 至少与protobuf
  • 一样快,并产生小输出
  • 很容易采用当前项目,如protobuf-net
  • 允许序列化图形,如DataContractSerializer,并将PreserveObjectReferences设置为true
  • 不仅对于简单对象是稳定的,而且对于复杂的现实世界场景也是稳定的

3 个答案:

答案 0 :(得分:7)

Bartosz,虽然这个问题已经很久了,但我可能会建议你和偶然发现它的人使用Migrant,可以从源代码和NuGet包中找到它们。我是其中一位合着者。

即使是复杂的场景也可以轻松采用,我们尽量使其易于使用。

输出尺寸相当小。当然,这取决于你的对象树,但它可以与protobuf-net相媲美。与protobuf一样,它使用Varint和ZigZag编码。

当然,Migrant可以解决您提到的问题 - 它保留了对象的整个图形,处理继承,复杂集合,版本容差(最多到某些点)等。

就速度而言,我们试图与protobuf-net进行比较。它使用动态生成的方法支持de / serialization,这比基于经典反射的解决方案快得多。

我链接到的网站上提供了简单的使用方案,但简单的对象克隆很简单。

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

写入流非常简单。

当然,对于非常复杂的类型,有一组类装饰器(属性,钩子)可以使事情变得更加智能; - )

答案 1 :(得分:1)

我们正在考虑MessagePack。他们声称比ProtoBuf快4倍。但是我不知道它是否支持完整的对象图。 (我们没有这个要求,我们实际上压扁了用于通信的对象) 在我的场景中,我会将它用于.Net和delphi层之间的通信(这也是阻碍我的东西,没有delphi支持:))

答案 2 :(得分:0)

现在回答这个具体问题可能会迟到,但我会在这里发布,因为可能会寻求同样的事情,因为参考跟踪仍然在protobuf-net中被打破。

您可以使用分叉:AqlaSerializer。它比工作参考跟踪有更多的改进:

  • 嵌套馆藏
  • 多维数组
  • 非常灵活且可扩展的映射

和其他许多人。

免责声明:我是作者。