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将严重违反接吻原则。