2010-03-01 89 views
1

我有2類:鑄造XML來繼承

public class ClassA 

public class ClassB (from another namespace) : ClassA 

我的XML文件填充ClassA

如何在反序列化時將其轉換爲ClassB

是否有可能?

回答

1

我試過這個解決方案,即應用一個XmlRoot元素,指定與ClassA中相同的元素名稱。
這應該工作:

using System; 
using System.IO; 
using System.Xml.Serialization; 

[XmlRoot("ClassA")] 
public class ClassA { 
    [XmlElement] 
    public String TextA { 
     get; 
     set; 
    } 
} 

[XmlRoot("ClassA")] // note that the two are the same 
public class ClassB : ClassA { 
    [XmlElement] 
    public String TextB { 
     get; 
     set; 
    } 

} 

class Program { 
    static void Main(string[] args) { 

     // create a ClassA object and serialize it 
     ClassA a = new ClassA(); 
     a.TextA = "some text"; 

     // serialize 
     XmlSerializer xsa = new XmlSerializer(typeof(ClassA)); 
     StringWriter sw = new StringWriter(); 
     xsa.Serialize(sw, a); 

     // deserialize to a ClassB object 
     XmlSerializer xsb = new XmlSerializer(typeof(ClassB)); 
     StringReader sr = new StringReader(sw.GetStringBuilder().ToString()); 
     ClassB b = (ClassB)xsb.Deserialize(sr); 

    } 
} 
+0

我得到錯誤: 不期望元素ClassA的 在這一行: ClassB的B =(ClassB的)xsb.Deserialize(SR); – user278618 2010-03-01 09:13:19

+0

然後,您應該將[XmlRoot(「ClassA」)]屬性應用於類B.我將更新代碼。 – 2010-03-01 09:27:50

+0

您可能還需要使用[XmlInclude()]語句來告訴它哪些類可以出現在那裏。例如(雖然在C#中獲取的類型可能略有不同,但我只有一個VB示例):[XmlInclude(GetType(ClassB))] – 2010-03-01 12:16:37

1

您無法將基類轉換爲派生類 - 只能將派生類轉換回其基類(單向)。

0

當創建XmlSerialiser時,您需要從您的ClassB中執行它,然後將它作爲您希望的類反序列化。

將基類作爲派生類的實例進行投射是無效的。