C# 使用[XmlAnyElement]

C# 使用[XmlAnyElement],c#,xml-serialization,C#,Xml Serialization,我试图在一个对象的两个不同版本上保存数据,但没有成功。谁能告诉我我做错了什么 类的第一个版本: [DataContract (Name="Person")] public class Person_V1 { [DataMember(Name = "Name")] public string Name; [DataMember(Name = "Age")] public int Age; [XmlAnyElement] publ

我试图在一个对象的两个不同版本上保存数据,但没有成功。谁能告诉我我做错了什么

类的第一个版本:

 [DataContract (Name="Person")]
 public class Person_V1
 {
     [DataMember(Name = "Name")]
     public string Name;

     [DataMember(Name = "Age")]
     public int Age;

     [XmlAnyElement]
     public XmlElement[] XElements;
}
[DataContract(Name = "Person")]
public class Person_V2
{
    [DataMember(Name = "Name")]
    public string Name;

    [DataMember(Name = "Age")]
    public int Age;

    [DataMember(Name = "Weight")]
    public int Weight;

    [XmlAnyElement]
    public XmlElement[] XElements;
}
课程第二版:

 [DataContract (Name="Person")]
 public class Person_V1
 {
     [DataMember(Name = "Name")]
     public string Name;

     [DataMember(Name = "Age")]
     public int Age;

     [XmlAnyElement]
     public XmlElement[] XElements;
}
[DataContract(Name = "Person")]
public class Person_V2
{
    [DataMember(Name = "Name")]
    public string Name;

    [DataMember(Name = "Age")]
    public int Age;

    [DataMember(Name = "Weight")]
    public int Weight;

    [XmlAnyElement]
    public XmlElement[] XElements;
}
正在保存对象的V2:

private void btnSave_V2_Click(object sender, EventArgs e)
{
    Person_V2 p = new Person_V2() { Name = "Carrie", Age = 31, Weight = 125 };

    var ds = new DataContractSerializer(typeof(Person_V2));

    XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };

    using (XmlWriter w = XmlWriter.Create("person.xml", settings))
        ds.WriteObject(w, p);
}
正在将对象的V2还原为V1对象。希望看到重量变量信息保存在XElements数组中,但没有发生

private void btnRestore_V1_Click(object sender, EventArgs e)
{
    Person_V1 p;

    var ds = new DataContractSerializer(typeof(Person_V1));

    XmlReaderSettings settings = new XmlReaderSettings();

    using (XmlReader r = XmlReader.Create("person.xml", settings))
        p = (Person_V1)ds.ReadObject(r);

    MessageBox.Show(p.Name + " " + p.Age);
}

Xml*属性
类由
XmlSerializer
使用,而不是由
DataContractSerializer
使用。据我所知,
DataContractSerializer
没有任何机制来处理这种情况。如果可以,请使用
XmlSerializer
,它会更加灵活。

如果这是应用程序的要求,您可以添加一个用属性修饰的方法,然后实现您自己的逻辑,将缺少的字段添加到XmlElement集合。

要保留未来或过去版本的
DataContract
s的未知元素,可以实现该接口。这样做将导致将任何未知元素放置在名为
ExtensionData
的属性中,该属性允许将来在不丢失数据的情况下重新序列化

示例用法如下:

[DataContract(Name="Person")]
public class Person_V1 : IExtensibleDataObject
{
    [DataMember(Name = "Name")]
    public string Name;

    [DataMember(Name = "Age")]
    public int Age;

    public ExtensionDataObject ExtensionData { get; set; }
}

Person\u V2
对象反序列化为
Person\u V1
对象时,
Weight
属性存储在
ExtensionData
中,并在重新序列化时返回到序列化流。

我根本不希望看到它。为什么不呢?我认为[XmlAnyElement]是xml文件中不属于对象的所有数据的总括。我完全离开这里了吗?这是一个数组,所以它们将包含在一个XElememts标记中。任何其他选择都意味着,如果在Xelements中包含年龄、姓名、体重,则会覆盖单个属性。避免taht将严重违反接吻原则。