在 xml c# 的反序列化期间更改元素的名称

Changing an element's name during deserialization of xml c#

我有一个 class 看起来像这样:

[XmlType(TypeName = "rootType")]
public class myClass
{
    public Class1 class1;
    public Class2 class2;

    [XmlType(TypeName = "type1")]
    public class class1
    { ... class1 definition ...}
    [XmlType(TypeName = "type2")]
    public class class2
    { ... class1 definition ...}    

}

当我序列化它时,生成的 xml 将是

<rootType>
    <class1>
       ... some stuff
    <class1/>
    <class2>
       ... some stuff
    <class2/>
<rootType/>

但是,我的问题是这些 xml 类型装饰刚刚添加到 class,这意味着在以前的版本(客户使用的版本)中 xml 看起来像

<myClass>
    <type1>
       ... some stuff
    <type1/>
    <type2>
       ... some stuff
    <type2/>
<myClass/>

有没有一种方法可以控制反序列化过程(或任何其他解决此问题的方法),如果可能,并且能够使用这些 XmlType 装饰将此 xml 反序列化为 myClass?

你的问题彻底解决了。

首先,当您创建序列化程序时,添加一个具有所需名称的 XmlRootAttribute 参数。

其次,将事件处理程序添加到序列化程序。

var serializer = new XmlSerializer(typeof(myClass), new XmlRootAttribute("myClass"));
serializer.UnknownElement += Serializer_UnknownElement;

事件处理程序应如下所示:

void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
    myClass my = (myClass)e.ObjectBeingDeserialized;

    if (e.Element.Name == "type1")
    {
        var ser = new XmlSerializer(typeof(myClass.Class1));
        using (var sr = new StringReader(e.Element.OuterXml))
            my.class1 = (myClass.Class1)ser.Deserialize(sr);
    }
    else if (e.Element.Name == "type2")
    {
        var ser = new XmlSerializer(typeof(myClass.Class2));
        using (var sr = new StringReader(e.Element.OuterXml))
            my.class2 = (myClass.Class2)ser.Deserialize(sr);
    }
}

一如既往地使用:

myClass my;
using (var fs = new FileStream("test.xml", FileMode.Open))
    my = (myClass)serializer.Deserialize(fs);

它应该有效。