当前位置 : 主页 > 大数据 > 区块链 >

.net – 替代protobuf-net – 大小和时间有效的序列化器来处理对象图

来源:互联网 收集:自由互联 发布时间:2021-06-22
Google protobuf是将对象序列化的高效协议,但它只支持树的序列化,而不是图形(缺少完整的对象引用跟踪). 在.NET中几乎没有实现Google的想法. (即protobuf-csharp-port或protosharp),但最有趣的是pro
Google protobuf是将对象序列化的高效协议,但它只支持树的序列化,而不是图形(缺少完整的对象引用跟踪).

在.NET中几乎没有实现Google的想法. (即protobuf-csharp-port或protosharp),但最有趣的是protobuf-net.

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

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

不必要的Protobuf-net v2是测试版,而AsReference选项不适用于现实世界的场景. (没有这个选项,一切都很好,但是没有参考文献Tracikng protobuf-net不能够序列化图形,并不是更有吸引力的serializer).

它仍然有一些错误:

> Issue 196
> Issue 213
> Issue 232
> Issue 242
> SO 6294295
> SO 7219959

所以,我不能使用这个伟大的工具,我正在寻找替代串行器,其中:

>至少一样快,产量小到protobuf
>易于采用目前的项目,如protobuf-net
>允许将数据类型DataContractSerializer序列化,将PreserveObjectReferences设置为true
>不仅对于简单的对象,而且对于复杂的现实世界场景是稳定的

Bartosz,虽然这个问题很旧,但我可能建议你和谁绊倒它使用 Migrant,从源和 NuGet包可用.我是合着者之一.

即使复杂的场景也可以很容易地采用,我们尽量使它变得容易使用.

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

当然,移民解决了你提到的问题 – 它保留对象的整个图形,处理继承,复杂的集合,版本容限(直到某一点)等等.

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

我已经链接到的站点上提供了简单的使用场景,但简单的对象克隆是直观的.

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

写入流是一样简单.

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

网友评论