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;

用户同时安装了我的程序的旧版本和新版本,这是一个常见的用例。它们读取和写入相同的序列化文件。当新版本写入文件时,所有三个属性(FirstNameLastNameMiddleName)都将写入。旧程序读取文件,但省略未知元素MiddleName。它保存文件而不MiddleName,因此对于较新的程序来说,它的价值会丢失。

有没有办法在反序列化时存储原始 XML,并在序列化时将未知元素"合并"回去?旧程序会忽略未知元素,但将它们写回文件中,这样新程序就不会丢失它们。

XmlSerializer:保留未知元素

现在无法测试它,因为我使用的是Mac OS X,但是XmlAnyElement应该可以工作:

[XmlAnyElement]
public XmlElement[] Unsupported { get; set; }

XMLSerializer 序列化。如果信息不可用,它如何序列化它?

您可以做的是更新 xmlfile,而不是序列化和覆盖它。这是额外的工作,因为您必须自己遍历文件,但它可以让您实现您想要的。

如何在 .NET Framework SDK 中使用 XmlDocument 类修改和保存 XML