2011-12-15 24 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,並返回到序列化流,當它被重新序列化。