XmlSerializer:保留未知元素
XmlSerializer: keep unknown elements
我有一个 class 从 XML 序列化 into/deserialized 并从文件存储 in/restored:
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);
}
}
在这个 class 的较新版本中,我添加了一个新的 属性
public string MiddleName;
用户同时安装了我的程序的新旧版本是一个常见的用例。他们都读取和写入相同的序列化文件。新版本写入文件时,三个属性(FirstName
、LastName
、MiddleName
)都被写入。旧程序读取文件但忽略了未知元素 MiddleName
。它在没有 MiddleName
的情况下保存文件,因此它的值对于较新的程序来说丢失了。
有没有办法在反序列化时存储原始 XML 并在序列化时 'merge' 返回未知元素?旧程序会忽略未知元素,但会将它们写回文件中,这样新程序就不会丢失它们。
XMLSerializer 序列化。如果信息不可用,它如何序列化它?
您可以做的是更新 xml 文件,而不是序列化和覆盖它。这是额外的工作,因为您必须自己遍历文件,但它可以让您实现您想要的。
How To Modify and Save XML with the XmlDocument Class in the .NET Framework SDK
现在无法测试,因为我在 Mac OS X,但 XmlAnyElement 应该可以:
[XmlAnyElement]
public XmlElement[] Unsupported { get; set; }
我有一个 class 从 XML 序列化 into/deserialized 并从文件存储 in/restored:
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);
}
}
在这个 class 的较新版本中,我添加了一个新的 属性
public string MiddleName;
用户同时安装了我的程序的新旧版本是一个常见的用例。他们都读取和写入相同的序列化文件。新版本写入文件时,三个属性(FirstName
、LastName
、MiddleName
)都被写入。旧程序读取文件但忽略了未知元素 MiddleName
。它在没有 MiddleName
的情况下保存文件,因此它的值对于较新的程序来说丢失了。
有没有办法在反序列化时存储原始 XML 并在序列化时 'merge' 返回未知元素?旧程序会忽略未知元素,但会将它们写回文件中,这样新程序就不会丢失它们。
XMLSerializer 序列化。如果信息不可用,它如何序列化它?
您可以做的是更新 xml 文件,而不是序列化和覆盖它。这是额外的工作,因为您必须自己遍历文件,但它可以让您实现您想要的。
How To Modify and Save XML with the XmlDocument Class in the .NET Framework SDK
现在无法测试,因为我在 Mac OS X,但 XmlAnyElement 应该可以:
[XmlAnyElement]
public XmlElement[] Unsupported { get; set; }