【问题标题】:Scenarios where Xml Serialization fail in .NET.NET 中 Xml 序列化失败的场景
【发布时间】:2010-10-18 06:26:25
【问题描述】:

我想知道 .NET 中 xml 序列化可能失败的最常见场景。

【问题讨论】:

标签: c# .net xml-serialization


【解决方案1】:

我在这里主要考虑XmlSerializer

  • 仅限于树状数据;它无法处理完整的对象图
  • 它仅限于公共成员,在公共课程中
  • object 成员真的没什么用
  • 它在泛型方面存在一些弱点
  • 与许多序列化程序一样,它不会触及集合上的实例属性(首先是不好的做法)
  • xml 并不总是适合大数据(尤其是性能方面)
  • 需要一个公共的无参数构造函数

DataContractSerializer 解决了其中的一些问题,但有其自身的局限性:

  • 它无法处理属性中的值
  • 需要 .NET 3.0(所以在 2.0 中用处不大)

【讨论】:

  • 使用 DataContractSerializer 可以解决公共成员问题
  • 这些都是关于 .NET 中 Xml 序列化框架的好消息,但我不会说它们是 XML 序列化“失败”的常见场景。例如,Xml 序列化程序只序列化公共读/写成员是序列化框架的一个属性,而不是它失败的场景。它要求类具有公共无参数 ctor 本身也不是“失败”。
【解决方案2】:

无法轻松序列化泛型集合。

查看另一个问题:C# XML Serialization Gotchas

【讨论】:

    【解决方案3】:

    根据序列化程序,循环引用可能不起作用

    【讨论】:

      【解决方案4】:

      对我来说,使用 shadows 关键字也破坏了序列化和反序列化,因为阴影会导致该属性的新实现存在,使其与正确重建不兼容。仅当您想重新键入子类的特定内容时才使用重载。

      【讨论】:

      • 对于不了解VB.NET的人来说,“Shadows”相当于C#中的newpublic new int PropertyName {get;set;},其中基类有一个public virtual int PropertyName ...
      【解决方案5】:

      TimeSpan 对象不可序列化。 IDictionary-implementing 类型也不是可序列化的(尽管它们可以通过一些手动按摩来序列化)。

      【讨论】:

        【解决方案6】:

        AFAIK,自 .NET 2.0 起,标记为 [Obsolete] 的类不会被 XmlSerializer 序列化

        【讨论】:

          猜你喜欢
          • 2013-05-18
          • 1970-01-01
          • 1970-01-01
          • 2012-12-26
          • 1970-01-01
          • 1970-01-01
          • 2018-01-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多