二进制对象图序列化

时间:2011-08-03 08:50:53

标签: c# .net serialization protocol-buffers binaryformatter

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

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

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

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

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

所以问题:

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

2 个答案:

答案 0 :(得分:5)

协议缓冲区作为格式没有对象图的官方支持,但protobuf-net 提供此功能,并满足您的其他要求。轮流拿点:

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

不确定; protobuf-net可以为公共和非公共领域做到这一点;在运行时或通过属性

告诉它有关字段的信息
  • 不得要求无参数构造函数。

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

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

不确定;在成员上标记AsReference=true

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

标准列表和词典工作正常; 然而,我有一个未完成的变更请求,以支持 字典中的AsReference 。这意味着,Dictionary<string, Foo> 目前不会运行Foo的图形代码,但如果它导致您的重大痛苦,我可能会发现一些时间来看看这个 p>

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

完全支持序列化回调

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

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

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

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

答案 1 :(得分:0)

尝试db4o,它不是真正的序列化程序,但据我所知它符合您的要求(复杂类型,深度图,继承?,字典等),您不必更改任何内容对象,API非常易于使用。

它支持架构版本控制/合并。