最大的區別是,當你需要告訴XmlSerializer
約子類 - 例如:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
new Type[] { typeof(SportCar), typeof(Radio) });
在這裏,沒有額外的信息,如果不知道(距離Car
)約要麼SportCar
或Radio
- 所以,如果你給它一個對象,它實際上是一個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) })
),則每次都會執行類型生成。
如果我指定子類信息,輸出的區別是什麼? (我是序列化過程的新手) – Anonymous 2009-06-19 07:57:08
使用XmlInclude方法和構造函數(new Type [])方法之間的輸出沒有區別;它們是等價的。如果你不這樣做,並要求一個XmlSerializer(typeof(汽車)),但給它一個SportCar - 它會拋出一個異常。 – 2009-06-19 08:07:58
我在閱讀了關於C#3.0上關於XmlSerializer的主題之後,回過頭來閱讀提及「關於子類」的答案,這讓我明白了XmlSerializer的工作原理。 (我購買另一本書來研究C#,太糟糕了。) – Anonymous 2009-06-19 08:46:19