Google protobuf是高效序列化对象的绝佳协议,但只有支持树的序列化,而不支持图(缺少完整的对象参考跟踪)。
在.NET中实现Google的想法很少。 (即protobuf-csharp-port或protosharp),但最有趣的是protobuf-net。
Protobuf-net更好,因为它的架构适合.NET世界,有几个插件(并不总是与原始protobuf兼容,但非常有用)。
其中一个加载项是打开引用跟踪(AsReference选项)的可能性,它允许甚至在循环时序列化复杂的图形。
不必要的Protobuf-net v2处于测试阶段, AsReference选项无法在真实场景中使用。 (没有这个选项一切都运行良好,但没有Reference Tracikng protobuf-net无法序列化图形,也不再具有吸引力的序列化程序)。
它仍有一些错误:
所以,我不能使用这个伟大的工具,我正在寻找替代的序列化器:
答案 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。它比工作参考跟踪有更多的改进:
和其他许多人。
免责声明:我是作者。