2009-04-22 46 views
13

說我有幾個基本的對象,像這樣:如何在事先不知道類型的情況下反序列化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); 
} 

除非我能夠通過它的XML文件,從基本下降和正確的類將被創建的任何類。

我在想我可以讀取XML根節點的名稱並使用switch語句來創建正確的XmlSerializer,但我想知道是否有更簡單的方法。

+0

好的。剛剛檢查。它拋出一個例外。已刪除最後一個段落。 – Kirtan 2009-04-22 04:50:32

+0

好的,刪除了我的評論,因爲它不再適用。 – Ray 2009-04-22 05:14:10

回答

8

使用[XmlInclude]屬性上你的基類來講述派生類XML序列化,所以它可以找出創建的內容。您的最後一段代碼應該可以正常工作。

9

可以讀取XML文件的根節點,而不是使用switch語句,你可以寫你這樣的代碼 -

Type yourType = Type.GetType("Your Type"); 
XmlSerializer xs = new XmlSerializer(yourType); 

我不認爲還有比讀取XML其他任何方式,因爲如果你不知道這種類型,你什麼都做不了。

0

據我所知,沒有更簡單的方法來做到這一點。

我個人更喜歡更通用的解決方案(因爲我必須序列化我的代碼中的很多不同的類):保持類型名稱與值一起序列化。

你可以看看這個問題的一些細節: Serialise to XML and include the type of the serialised object

相關問題