![](/img/trans.png)
[英]Is there any limits for binary serialization / deserialization object graph size in .net?
[英]Binary object graph serialization
我正在寻找有关.net应用程序序列化的建议。 该应用程序是桌面/胖客户端应用程序,序列化表示持久文档格式。 序列化器的要求是
目前我们使用BinaryFormatter来处理上述所有问题,但是尺寸/性能和版本容差是个问题。 我们使用[OnDeserialized / ing]属性来提供兼容性,但它不允许大型重构(比如命名空间更改)而不需要复杂使用代理等等。
理想的解决方案是直接替换BinaryFormatter,它可以与我们现有的[NonSerialized]注释等一起使用,但性能更好,并且生成的格式更小,更易于维护。
我已经查看了不同的protobuf实现,尽管现在似乎可以序列化一般对象图/枚举/结构,但是使用大量框架集类型等序列化复杂图形似乎并不容易。而且,即使我们可以使用字段而不是属性我理解它仍然意味着必须向所有类添加无参数构造函数和protobuf注释(域约为1000个类)。
所以问题:
协议缓冲区作为一种格式没有对象图的官方支持,但protobuf-net 确实提供了这一点,并满足您的其他要求。 依次取点:
当然; protobuf-net可以为公共和非公共领域做到这一点; 在运行时或通过属性告诉它有关字段的信息
这在“v2”中可用 - 再次,您可以告诉它在运行时或通过属性跳过构造函数(合同上的SkipConstructor=true
)
当然; 在成员上标记AsReference=true
标准列表和词典工作正常; 但是 ,我有一个优秀的变更请求支持AsReference
的字典里 。 意思是, Dictionary<string, Foo>
目前不会运行Foo
的图形代码,但是如果它引起你的重大痛苦,我可能会找一些时间看看这个
完全支持序列化回调
命名空间等对protobuf-net一点都不感兴趣(除非你使用的是DynamicType
选项)
不必要; 如果您可以保证不会更改字段名称,可以要求它在内部推断字段编号 - 最终在“v2”中可以在运行时指定所有内容 ,因此您通常可以编写一个运行于的小配置循环app-startup并使用反射来配置系统。 然后,你不需要改变你的现有代码。
试试db4o ,它不是真正的串行器,但据我所知,它可以满足您的要求(复杂类型,深度图,继承?,字典等),您不必更改对象上的任何内容,并且API非常使用方便。
它支持模式版本控制/合并。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.