我正在寻找有关.net应用程序中序列化的建议。该应用程序是桌面/胖客户端应用程序,序列化表示持久文档格式。序列化器的要求是
目前我们使用BinaryFormatter来处理上述所有问题,但是尺寸/性能和版本容差是个问题。我们使用[OnDeserialized / ing]属性来提供兼容性,但它不允许大型重构(比如命名空间更改)而不需要复杂使用代理等等。
理想的解决方案是BinaryFormatter的替代品,它可以与我们现有的[NonSerialized]注释等一起使用,但效果更好,并且可以生成更小,更易于维护的格式。
我已经查看了不同的protobuf实现,尽管现在似乎可以序列化一般对象图/枚举/结构,但是使用大量框架集合类型等序列化复杂图形似乎并不容易。即使我们可以使用字段而不是属性,我理解它仍然意味着必须向所有类添加无参数构造函数和protobuf注释(域大约是1000个类)。
所以问题:
答案 0 :(得分:5)
协议缓冲区作为格式没有对象图的官方支持,但protobuf-net 提供此功能,并满足您的其他要求。轮流拿点:
不确定; protobuf-net可以为公共和非公共领域做到这一点;在运行时或通过属性
告诉它有关字段的信息这在“v2”中可用 - 再次,您可以告诉它在运行时或通过属性(合同上的SkipConstructor=true
)跳过构造函数
不确定;在成员上标记AsReference=true
标准列表和词典工作正常; 然而,我有一个未完成的变更请求,以支持 字典中的 完全支持序列化回调 命名空间等对protobuf-net一点都不感兴趣(除非你使用 不一定;如果您保证您不会更改字段名称,您可以要求它在内部推断字段编号 - 最终在“v2”中可以指定所有运行时,因此您通常可以编写一个在app-startup上运行的小配置循环,并使用反射来配置系统。然后,您无需更改现有代码 。AsReference
。这意味着,Dictionary<string, Foo>
目前不会运行Foo
的图形代码,但如果它导致您的重大痛苦,我可能会发现一些时间来看看这个1> p>
DynamicType
选项)
答案 1 :(得分:0)
尝试db4o,它不是真正的序列化程序,但据我所知它符合您的要求(复杂类型,深度图,继承?,字典等),您不必更改任何内容对象,API非常易于使用。
它支持架构版本控制/合并。