Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在不破坏向后兼容性的情况下向列表成员添加[XmlElement]属性吗?_C#_Xml_Xml Serialization - Fatal编程技术网

C# 我可以在不破坏向后兼容性的情况下向列表成员添加[XmlElement]属性吗?

C# 我可以在不破坏向后兼容性的情况下向列表成员添加[XmlElement]属性吗?,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我认为: public List<Vector3> Vectors; 公共列表向量; 将序列化为: <Vectors> <Vector3> <X>0</X> <Y>0</Y> <Z>0</Z> </Vector3> </Vectors> 0 0 0 我想移除封装标签,我相信我可以这样做: [XmlElement("Vector3")] pu

我认为:

public List<Vector3> Vectors;
公共列表向量;
将序列化为:

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

0
0
0
我想移除封装标签,我相信我可以这样做:

[XmlElement("Vector3")]
public List<Vector3> Vectors;
[xmlement(“Vector3”)]
公共列表向量;
应序列化为:

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

0
0
0
但我担心这会破坏仍然在列表中使用“Vectors”标记的旧XML文件。有解决这个问题的通用方法吗

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

<Container>

</Container>


我最初省略了这一点是为了缩短问题的时间。

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


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

除了向后兼容性,您如何期望单个Vector3元素表示类似于列表的东西,它本质上是多值结构?如何用单个XMLElement表示XML中有多个元素的向量?如果有多个元素,则每个元素将显示为值,并且在XML中指定的顺序是反序列化时它们在列表中的显示顺序-我相信这是相当标准的XML做法。值不是有效的XML。XML必须有一个根元素,这就是使用值的原因。我没有明确说明这一点,但我的意思是,列表是对象的一部分,整个对象将被序列化。因此,XML实际上类似于值,这是容器对象(如XAML中的Windows)列出其元素(如按钮和文本框)的方式。它们并没有用标记包围它们。您的XmlElement装饰应该可以移除Vectors容器。但我不确定我不确定你想解决什么。您写道不想破坏旧的xml文件。如果您担心向后兼容性,为什么要破坏它?