簡體   English   中英

在反序列化xml C#期間更改元素的名稱

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

我有一堂課,看起來像這樣:

[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/>

但是,我的問題是,這些xmltype裝飾剛剛添加到了類中,這意味着在先前版本(客戶端使用的版本)中,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);

應該可以的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM