2011-12-15 56 views
2

我试图保留两个不同版本的对象上的数据,但没有任何成功。谁能告诉我我做错了什么?使用[XmlAnyElement]

版本的一个类的:

[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); 
} 
+0

我不希望看到这一点。 – 2011-12-15 12:48:16

回答

1

Xml*Attribute类由XmlSerializer使用的,而不是由DataContractSerializer。据我所知,DataContractSerializer没有任何机制来处理这种情况。如果可以的话,用XmlSerializer代替,它更灵活。

0

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

1

要保留未来或以前版本的DataContract s的未知元素,可以实现IExtensibleDataObject接口。这样做会导致任何未知元素被放置在一个名为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_V2对象被反序列化到一个Person_V1目的,Weight属性存储在ExtensionData,并返回到序列化流,当它被重新序列化。