XmlSerializer:保留未知元素
我有一个从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