【问题标题】:XmlSerializer: keep unknown elementsXmlSerializer:保留未知元素
【发布时间】: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;

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

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

【问题讨论】:

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

标签: c# serialization xmlserializer


【解决方案1】:

目前无法测试,因为我在 Mac OS X 上,但 XmlAnyElement 应该可以工作:

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

【讨论】:

  • 太好了,这正是我想要的!
【解决方案2】:

XMLSerializer 序列化。如果信息不可用,它怎么能序列化呢?

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

How To Modify and Save XML with the XmlDocument Class in the .NET Framework SDK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多