文件存储的序列化

Ste*_*fan 7 .net c# serialization xml-serialization

我编写了一个可以打开/编辑/保存文档的桌面应用程序.

这些文档由几个不同类型的对象描述,这些对象存储彼此的引用.当然,有一个Document类作为此数据结构的根.

问题是如何将此文档模型保存到文件中.

我需要的:

  • 支持递归结构.
  • 它必须能够打开文件,即使它们是从稍微不同的类生成的.我的用户不希望在每次发布后重新创建每个文档只是因为我在某处添加了一个字段.
  • 它必须处理编译时未知的类(用于插件支持).

到目前为止我累了:

  • XmlSerializer - >失败了第一个和最后一个标准.
  • BinarySerializer - >失败了第二个标准.

  • DataContractSerializer:与XmlSerializer类似,但支持循环(递归)引用.它的设计也考虑了(向前/向后)兼容性:数据合同版本控制.[编辑]

  • NetDataContractSerializer:虽然DataContractSerializer仍然需要提前知道所有类型(即它不能很好地继承),NetDataContractSerializer会在输出中存储类型信息.除此之外,两者似乎是等价的.[编辑]

  • protobuf-net:没有时间尝试它,但它似乎在功能上与DataContractSerializer类似,但使用二进制格式.[编辑]

处理未知类型[编辑]

当静态和动态类型不同时,似乎有两种关于该做什么的哲学(如果你有一个类型为object的字段,但是a,比方说,其中包含Person-object).基本上动态类型必须以某种方式存储在文件中.

  • 对不同的动态类型使用不同的XML标记.但是,由于要用于特定类的XML标记可能不等于类名,因此如果反序列化器事先知道所有可能的类型(以便他可以扫描它们的属性),则只能使用此路由.

  • 在序列化期间存储CLR类型(类名,程序集名称和版本).在反序列化期间使用此信息来实例化正确的类.在反序列化之前不得知道这些类型.

第二个更易于使用,但生成的文件将依赖于CLR(并且对代码修改不太敏感).这可能是为什么XmlSerializerDataContractSerializer选择第一种方式.NetDataContractSerializer不推荐,因为它使用第二个approch(BinarySerializer顺便说一下).

有任何想法吗?

DW.*_*DW. 4

您还没有尝试过的是 DataContractSerializer。有一个构造函数采用参数 bool keepObjectReferences 来处理第一个条件。