Dot-Net
如何在事先不知道類型的情況下反序列化 XML?
假設我有幾個基本對象,如下所示:
[Serializable] public class Base { public string Property1 { get; set; } public int Property2 { get; set; } } [Serializable] public class Sub: Base { public List<string> Property3 { get; set; } public Sub():base() { Property3 = new List<string>(); } }我像這樣序列化它們:
Sub s = new Sub {Property1 = "subtest", Property2 = 1000}; s.Property3.Add("item 1"); s.Property3.Add("item 2"); XmlSerializer sFormater = new XmlSerializer(typeof(Sub)); using (FileStream fStream = new FileStream("SubData.xml", FileMode.Create, FileAccess.Write, FileShare.None)) { sFormater.Serialize(fStream, s); }我怎樣才能反序列化它們,以便我回到正確的類?
如,我想要這樣的東西
XmlSerializer bFormater = new XmlSerializer(typeof (Base)); Base newBase; using (FileStream fStream = new FileStream("BaseData.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) { newBase = (Base) bFormater.Deserialize(fStream); }除了我能夠為從 Base 派生的任何類傳遞一個 XML 文件,並且將創建正確的類。
我想我可以讀取 XML 根節點的名稱並使用 switch 語句來創建正確的 XmlSerializer,但我想知道是否有更簡單的方法。
使用
[XmlInclude]基類的屬性告訴 XML 序列化器派生類,這樣它就可以確定要創建什麼。您的最後一個程式碼段應該可以正常工作。
您可以讀取 XML 文件的根節點,而不是使用 switch 語句,您可以像這樣編寫程式碼 -
Type yourType = Type.GetType("Your Type"); XmlSerializer xs = new XmlSerializer(yourType);我認為除了閱讀 XML 之外別無他法,因為如果您不知道類型,您將無能為力。