XmlSerializer: keep unknown elements

对着背影说爱祢 提交于 2019-12-19 19:02:44

问题


I have a class that is serialized into/deserialized from XML and stored in/restored from a file:

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);
    }
}

In a newer version of this class I added a new property

public string MiddleName;

It is a common use case that a user has installed both the old and new version of my program. They both read and write the same serialized file. When the new version writes the file, all three properties (FirstName, LastName, MiddleName) are written. The old program reads the file but omits the unknown element MiddleName. It saves the file without MiddleName, so it's value is lost for the newer program.

Is there a way to store the original XML when deserializing and 'merge' the unknown elements back in when serializing? The old program would ignore unknown elements but write them back into the file so they are not lost for the new program.


回答1:


Can't test it right now as I'm on Mac OS X, but XmlAnyElement should work:

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



回答2:


XMLSerializer serializes. If the info is not available how could it serialize that?

What you could do is update the xmlfile, instead of serializing and overwriting it. It is extra work because you will have to traverse the file yourself but it allows you to achieve what you want.

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



来源:https://stackoverflow.com/questions/34787284/xmlserializer-keep-unknown-elements

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!