【发布时间】:2016-04-19 15:25:56
【问题描述】:
我有一个从 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 并在序列化时“合并”未知元素?旧程序会忽略未知元素,但会将它们写回文件中,这样新程序就不会丢失它们。
【问题讨论】:
-
不使用 xmlserializer,不。 xmlserializer 如何知道他的未知字段是什么
-
将
Version属性引入序列化对象早期。当旧版本尝试从新版本读取 xml 时 - 你应该抛出“未知版本”异常(或者,如果你愿意,反序列化它并在某处设置标志 not 序列化更改,因此不会覆盖原始文件并丢失未知的属性值)。反过来,新版本将能够做一些事情来支持向后兼容性(例如,根据版本设置对象的新属性值)。 -
如果您在数据类上实现the IXmlSerializable interface,这是可能的,那么您可以完全控制序列化过程。我做了一些非常相似的事情,在 XML 被反序列化后,原始 XML 被保留为数据实体的一部分,但是在反序列化调用之后立即将其分配给属性。
-
@Icepickle 你的回答有点不正确 - 它可以与 XmlSerializer 一起使用,但前提是你实现了 IXmlSerializable。
-
@slugster 我认为他无法更新他的旧程序的类,这样就不可能了,但感谢更新:)
标签: c# serialization xmlserializer