因此,我使用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);
一切看起来不错。事情很好地序列化到磁盘上,我也可以反序列化它们。
然后我不得不做一些重构。类Apple
和Orange
已移至新项目(因此也移至另一个名称空间)。这破坏了向后兼容性,并且旧文档无法再反序列化。我遇到了与那些迁移的类有关的各种与XML名称空间相关的错误。
我目前正在尝试通过拦截反序列化过程,从XmlReader
继承并为Apples
和Oranges
节点返回新项目的名称空间来解决此问题,如下所示:
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
似乎正在生成d1p3
,d2p1
等形式的自动前缀。
我是走正确的道路还是有更好的方法来解决这个问题?如果这种方法正确,那么如何将前缀与名称空间相关?