XmlSerializer:保留未知元素
本文关键字:元素 未知 保留 XmlSerializer | 更新日期: 2023-09-27 18:30:32
我有一个类,它被序列化为XML/从XML反序列化,并存储在文件中/从文件中恢复:
public class Customer
{
public string FirstName;
public string LastName;
public Customer()
{
}
public Customer(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public static Customer Load(TextReader reader)
{
XmlSerializer deserializer = new XmlSerializer(typeof(Customer));
return (Customer)deserializer.Deserialize(reader);
}
public void Save(TextWriter writer)
{
XmlSerializer serializer = new XmlSerializer(GetType());
serializer.Serialize(writer, this);
}
}
在此类的较新版本中,我添加了一个新属性
public string MiddleName;
用户同时安装了我的程序的旧版本和新版本,这是一个常见的用例。它们读取和写入相同的序列化文件。当新版本写入文件时,所有三个属性(FirstName
、LastName
、MiddleName
)都将写入。旧程序读取文件,但省略未知元素MiddleName
。它保存文件而不MiddleName
,因此对于较新的程序来说,它的价值会丢失。
有没有办法在反序列化时存储原始 XML,并在序列化时将未知元素"合并"回去?旧程序会忽略未知元素,但将它们写回文件中,这样新程序就不会丢失它们。
现在无法测试它,因为我使用的是Mac OS X,但是XmlAnyElement应该可以工作:
[XmlAnyElement]
public XmlElement[] Unsupported { get; set; }
XMLSerializer 序列化。如果信息不可用,它如何序列化它?
您可以做的是更新 xmlfile,而不是序列化和覆盖它。这是额外的工作,因为您必须自己遍历文件,但它可以让您实现您想要的。
如何在 .NET Framework SDK 中使用 XmlDocument 类修改和保存 XML