使用
我正在尝试保留对象的两个不同版本的数据,并且没有取得任何成功。 谁能告诉我我做错了什么?
版本之一:
[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*Attribute
类由XmlSerializer
,而不是由DataContractSerializer
。 据我所知, DataContractSerializer
没有任何机制来处理这种情况。 如果可以,请使用XmlSerializer
,它更灵活。
要保留DataContract
的未来或过去版本的未知元素,可以实现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
,并在重新序列化时返回到序列化流。
如果这是应用程序的要求,则可以添加使用OnDeserializing属性修饰的方法,然后实现自己的逻辑以将缺少的字段添加到XmlElement集合中。