2017-06-02 65 views
0

我有一個類,看起來像這樣:的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?

+0

您可以轉換舊的xml,並將其提供給您的新的反序列化器。這可能是最簡單的。 – Rook

+0

@Rook,我僅限於不改變舊的xml – Santi

+0

但xml如何不可變形?您可以在第一次加載文件時在內存中執行此操作,或者可以將其轉換爲臨時文件並加載該文件。 – Rook

回答

0

您的問題已完全解決。

首先,當您創建串行器時,請添加一個帶有所需名稱的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); 

它應該工作。

+0

我會試試這個! – Santi

+0

這工作完美,謝謝! – Santi

相關問題