繁体   English   中英

二进制对象图序列化

[英]Binary object graph serialization

我正在寻找有关.net应用程序序列化的建议。 该应用程序是桌面/胖客户端应用程序,序列化表示持久文档格式。 序列化器的要求是

  • 必须允许序列化字段,而不仅仅是公共属性。
  • 不能要求无参数构造函数。
  • 必须处理一般对象图,即不仅是DAG而是共享/双向引用。
  • 必须使用框架类(例如Serialize Dictionaries)。

目前我们使用BinaryFormatter来处理上述所有问题,但是尺寸/性能和版本容差是个问题。 我们使用[OnDeserialized / ing]属性来提供兼容性,但它不允许大型重构(比如命名空间更改)而不需要复杂使用代理等等。

理想的解决方案是直接替换BinaryFormatter,它可以与我们现有的[NonSerialized]注释等一起使用,但性能更好,并且生成的格式更小,更易于维护。

我已经查看了不同的protobuf实现,尽管现在似乎可以序列化一般对象图/枚举/结构,但是使用大量框架集类型等序列化复杂图形似乎并不容易。而且,即使我们可以使用字段而不是属性我理解它仍然意味着必须向所有类添加无参数构造函数和protobuf注释(域约为1000个类)。

所以问题:

  • 是否有任何“替代”二进制格式化程序,提供良好的文档格式,表现更好?
  • 协议缓冲区是否适合持久化大型通用对象图,包括框架类型?

协议缓冲区作为一种格式没有对象图的官方支持,但protobuf-net 确实提供了这一点,并满足您的其他要求。 依次取点:

  • 必须允许序列化字段,而不仅仅是公共属性

当然; protobuf-net可以为公共和非公共领域做到这一点; 在运行时或通过属性告诉它有关字段的信息

  • 不能要求无参数构造函数。

这在“v2”中可用 - 再次,您可以告诉它在运行时或通过属性跳过构造函数(合同上的SkipConstructor=true

  • 必须处理一般对象图,即不仅是DAG而是共享/双向引用。

当然; 在成员上标记AsReference=true

  • 必须使用框架类(例如Serialize Dictionaries)。

标准列表和词典工作正常; 但是 ,我有一个优秀的变更请求支持AsReference的字典 意思是, Dictionary<string, Foo> 目前不会运行Foo的图形代码,但是如果它引起你的重大痛苦,我可能会找一些时间看看这个

  • 我们使用[OnDeserialized / ing]属性来提供兼容性

完全支持序列化回调

  • 但它不允许大型重构(比如说命名空间更改)而不需要复杂使用代理等等。

命名空间等对protobuf-net一点都不感兴趣(除非你使用的是DynamicType选项)

  • 它仍然意味着必须向所有类添加无参数构造函数和protobuf注释

不必要; 如果您可以保证不会更改字段名称,可以要求它在内部推断字段编号 - 最终在“v2”中可以在运行时指定所有内容 ,因此您通常可以编写一个运行于的小配置循环app-startup并使用反射来配置系统。 然后,你不需要改变你现有代码。

试试db4o ,它不是真正的串行器,但据我所知,它可以满足您的要求(复杂类型,深度图,继承?,字典等),您不必更改对象上的任何内容,并且API非常使用方便。

它支持模式版本控制/合并。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM