2009-06-19 87 views
5

我必須創建具有3類XmlSerializer.Serialize曖昧

  • 無線電測試應用
  • SportCar:汽車(具有無線)

隨着連載過程中,當我創建XmlSerializer對象的實例我使用2個對象來測試

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar)); 

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

這2個方法的結果是相同的,所以我想知道的是這2構造函數或臨界點需要使用#2構造函數之間的區別?

回答

8

最大的區別是,當你需要告訴XmlSerializer類 - 例如:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car), 
    new Type[] { typeof(SportCar), typeof(Radio) }); 

在這裏,沒有額外的信息,如果不知道(距離Car)約要麼SportCarRadio - 所以,如果你給它一個對象,它實際上是一個SportCar,它會失敗:

Car car = new SportCar {...}; 
xmlSerializer.Serialize(destination, car); 

您還可以通過這樣做設置[XmlInclude(typeof(SportCar))]Car類型定義:

[XmlInclude(typeof(SportCar))] 
public class Car {...} 

這是比較容易的,但僅僅是可能的,如果Car類型是在知道SportCar組件。但你經常知道這一點,所以XmlInclude是首選的選項。

另外:有一些效率好處XmlInclude;幕後系統使用動態類型生成來使XmlSerializer高效。出於這個原因,您通常應該保持(並重新使用)您創建的XmlSerializer實例;例如,通過將其存儲在靜態字段中。但是,系統會自動執行此操作(new XmlSerializer(typeof(Car))) - 即無論您使用此構造函數多少次,它只會生成一次動態代碼。如果使用更復雜的構造函數(new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })),則每次都會執行類型生成。

+0

如果我指定子類信息,輸出的區別是什麼? (我是序列化過程的新手) – Anonymous 2009-06-19 07:57:08

+1

使用XmlInclude方法和構造函數(new Type [])方法之間的輸出沒有區別;它們是等價的。如果你不這樣做,並要求一個XmlSerializer(typeof(汽車)),但給它一個SportCar - 它會拋出一個異常。 – 2009-06-19 08:07:58

+0

我在閱讀了關於C#3.0上關於XmlSerializer的主題之後,回過頭來閱讀提及「關於子類」的答案,這讓我明白了XmlSerializer的工作原理。 (我購買另一本書來研究C#,太糟糕了。) – Anonymous 2009-06-19 08:46:19