我有2類:鑄造XML來繼承
public class ClassA
public class ClassB (from another namespace) : ClassA
我的XML文件填充ClassA
。
如何在反序列化時將其轉換爲ClassB
。
是否有可能?
我有2類:鑄造XML來繼承
public class ClassA
public class ClassB (from another namespace) : ClassA
我的XML文件填充ClassA
。
如何在反序列化時將其轉換爲ClassB
。
是否有可能?
我試過這個解決方案,即應用一個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);
}
}
您無法將基類轉換爲派生類 - 只能將派生類轉換回其基類(單向)。
當創建XmlSerialiser時,您需要從您的ClassB
中執行它,然後將它作爲您希望的類反序列化。
將基類作爲派生類的實例進行投射是無效的。
我得到錯誤: 不期望元素ClassA的 在這一行: ClassB的B =(ClassB的)xsb.Deserialize(SR); – user278618 2010-03-01 09:13:19
然後,您應該將[XmlRoot(「ClassA」)]屬性應用於類B.我將更新代碼。 – 2010-03-01 09:27:50
您可能還需要使用[XmlInclude()]語句來告訴它哪些類可以出現在那裏。例如(雖然在C#中獲取的類型可能略有不同,但我只有一個VB示例):[XmlInclude(GetType(ClassB))] – 2010-03-01 12:16:37