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

Bar*_*icz 11 .net serialization protocol-buffers datacontractserializer protobuf-net

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

在.NET中实现谷歌的想法很少.(即protobuf-csharp-port,或protosharp),但最有趣的是protobuf-net.

Protobuf-net更好,因为它的体系结构适合.NET世界,并且有几个加载项(并不总是与原始protobuf兼容,但非常有用).

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

不必要的Protobuf-net v2处于测试版,AsReference选项不适用于现实世界的场景.(没有这个选项一切都运行良好,但没有Reference Tracikng protobuf-net无法序列化图形,不再是有吸引力的序列化程序).

它仍然有一些错误:

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

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

Pio*_*fer 7

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

它甚至可以很容易地用于复杂的场景,我们试图让它尽可能地易于使用.

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

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

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

我链接到的网站上提供了简单的使用场景,但简单的对象克隆很简单.

var myComplexObject = new MyComplexType(complexParameters);
var myObjectCopy = serializer.DeepClone(myComplexObject);
Run Code Online (Sandbox Code Playgroud)

写入流非常简单.

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


Coh*_*hen 2

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

  • @Cohen - 我检查过 - **MessagePack 不支持对象继承** (4认同)