我可以在不破坏向后兼容性的情况下将[XmlElement]属性添加到List成员吗?

时间:2012-01-31 00:22:11

标签: c# xml xml-serialization

我相信以下内容:

public List<Vector3> Vectors;

将序列化为:

<Vectors>
 <Vector3>
  <X>0</X>
  <Y>0</Y>
  <Z>0</Z>
 </Vector3>
</Vectors>

我想删除我认为我可以这样做的包装标签:

[XmlElement("Vector3")]
public List<Vector3> Vectors;

应序列化为:

 <Vector3>
  <X>0</X>
  <Y>0</Y>
  <Z>0</Z>
 </Vector3>

但我担心会破坏仍在列表周围使用“Vectors”标签的旧XML文件。有没有一种常见的解决方法?

编辑:上面的列表将是容器对象的一部分,因此完整的XML可能以

开头
<Container>

结束
</Container>

我最初把它留下来以缩短问题。

1 个答案:

答案 0 :(得分:1)

我不相信XML有任何内置的版本控制机制。我认为你最好的选择是编写一些外部机制,它可以检测你定义的“版本”,并手动将旧版本反序列化为新的对象。您可能还需要定义一个新版本的成员变量或属性,它将与您的对象进行序列化,以防再次遇到同样的问题,因为一旦您第二次更改模式,您将需要担心3个版本。 / p>

您可以通过在对象上定义IXmlSerializable并定义readXml / writeXml函数来编写自定义反序列化方法,也可以使用某些外部进程根据旧版本生成新的XML格式。也许首先将XML文件加载到XmlDocument中,按照您的需要进行修复(即将Vector3节点向上移动一级并删除Vectors节点),然后将文档的OuterXml值保存到字符串中并通过MemoryStream反序列化。