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无法序列化图形,不再是有吸引力的序列化程序).
它仍然有一些错误:
所以,我不能使用这个伟大的工具,我正在寻找替代序列化器:
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)
写入流非常简单.
当然,对于非常复杂的类型,有一组类装饰器(属性,钩子)使事情变得更加智能;-)
我们正在考虑MessagePack。他们声称比 ProtoBuf 快 4 倍。但是我不知道它是否支持完整的对象图。(我们没有这个要求,我们实际上展平了用于通信的对象)在我的场景中,我将使用它在.Net和delphi层之间进行通信(这也是阻碍我的原因,没有delphi支持:) )
| 归档时间: |
|
| 查看次数: |
2892 次 |
| 最近记录: |