gpt4 book ai didi

c# - 文档存储序列化

转载 作者:太空狗 更新时间:2023-10-29 20:15:20 26 4
gpt4 key购买 nike

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

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

问题是如何将这个文档模型保存到文件中。

我需要什么:

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

到目前为止我累了:

  • XmlSerializer -> 第一个和最后一个条件失败。
  • BinarySerializer -> 不符合第二个标准。

  • DataContractSerializer:类似于 XmlSerializer,但支持循环(递归)引用。它还在设计时考虑了(向前/向后)兼容性:Data Contract Versioning . [编辑]

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

  • protobuf-net:还没来得及试验,不过功能上好像和DataContractSerializer差不多,不过是二进制格式。 [编辑]

未知类型的处理[编辑]

当静态类型和动态类型不同时(如果您有一个类型为对象的字段,但假设其中有一个 Person-object),似乎有两种关于该怎么做的哲学。基本上,动态类型必须以某种方式存储在文件中。

  • 为不同的动态类型使用不同的 XML 标签。但是由于用于特定类的 XML 标记可能不等于类名,因此只有反序列化器事先知道所有可能的类型(以便他可以扫描它们的属性)时才可能走这条路。

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

第二个使用起来更简单,但生成的文件将依赖于 CLR(并且对代码修改不太敏感)。这可能就是为什么 XmlSerializerDataContractSerializer 选择第一种方式的原因。不推荐 NetDataContractSerializer,因为它使用第二种方法(顺便说一句,BinarySerializer 也是如此)。

有什么想法吗?

最佳答案

您还没有尝试过的是 DataContractSerializer。有一个构造函数采用参数 bool preserveObjectReferences,它应该处理第一个条件。

关于c# - 文档存储序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2216838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com