自定义XML反序列化

时间:2020-02-12 15:20:02

标签: c# xml serialization namespaces

因此,我使用DataContractSerializer将应用程序的文档保存到磁盘。 Document类使用的所有类型都生活在一个名称空间中,如下所示:

namespace MyProjectVM
{
  class Document
  {
    public Apple[] Apples { get; set; }
    public Orange SelectedOrange { get; set; }
  }

  class Apple { ... }
  class Orange { ... }
}

我的序列化器如下:

private static readonly Type[] AllObjectTypes = {
      typeof(Apple),
      typeof(Orange),
    };

private DataContractSerializer S = new DataContractSerializer(typeof(Document), AllObjectTypes, 0x7F_FFFF, false, true, null);

一切看起来不错。事情很好地序列化到磁盘上,我也可以反序列化它们。

然后我不得不做一些重构。类AppleOrange已移至新项目(因此也移至另一个名称空间)。这破坏了向后兼容性,并且旧文档无法再反序列化。我遇到了与那些迁移的类有关的各种与XML名称空间相关的错误。

我目前正在尝试通过拦截反序列化过程,从XmlReader继承并为ApplesOranges节点返回新项目的名称空间来解决此问题,如下所示:

public override string NamespaceURI
{
  get
  {
    if (reader.NodeType == XmlNodeType.Element)
    {
      switch (reader.Name)
      {
        case "Apples":
        case "Oranges":
          return "http://schemas.datacontract.org/2004/07/NewProject";

        default:
          return reader.NamespaceURI;
      }
    }
    else
      return inner.NamespaceURI;
  }
}

,但仍然无法正常工作。好像我的名称空间与前缀一起使用,这就是我完全感到困惑的地方。 DataContractSerializer似乎正在生成d1p3d2p1等形式的自动前缀。

我是走正确的道路还是有更好的方法来解决这个问题?如果这种方法正确,那么如何将前缀与名称空间相关?

0 个答案:

没有答案