c# - 使用 [XmlAnyElement]

标签 c# xml-serialization

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

版本一:

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

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

     [XmlAnyElement]
     public XmlElement[] XElements;
}

类(class)的第二版:

[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*Attribute 类由 XmlSerializer 使用,而不是由 DataContractSerializer 使用。据我所知,DataContractSerializer 没有任何机制来处理这种情况。如果可以,请改用 XmlSerializer,它会灵活得多。

关于c# - 使用 [XmlAnyElement],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520228/

相关文章:

c# - 使用 C# .NET 处理 XML 中的禁用字符

c# - asp.net core 中的配置键是否应该不区分大小写?

c# - Webbrowser getelementbyname?

c# - 如何使 .NET 窗体始终位于另一个应用程序之上?

c# - 序列化包含 List<T> 的 List<T>

c# - XmlSerializer, "Specified"后缀和 IReflect

xml-serialization - 在 hbase 中存储分层数据的最佳方式

c# - WPF 中的液体布局?

c# - Entity Framework 4.3 with MVC on Edit 不保存复杂对象

c# - 使用DataContractSerializer序列化,反序列化不回来