2009-07-15 70 views
0

衆所周知,爲了能夠使用XmlSerializer序列化對象,您必須將它們的類聲明爲public - 其次,您將得到InvalidOperationException。這裏的問題是爲什麼?我發現XmlSerializer實際上生成並編譯一個全新的程序集,然後使用這個程序集來序列化你的對象。問題是,爲什麼它要求類是公開的,而使用反射很容易在我的程序集中訪問內部類型?爲什麼XmlSerializer需要聲明爲public的序列化對象的類?

回答

2

很簡單,因爲它不使用反射來序列化/反序列化你的類 - 它直接訪問公共屬性(和類)。

使用refleciton訪問成員將是非常昂貴的,所以相反,正如你在你的問題中提到的那樣,它使用反射產生一個序列化類,緩存它*,並且從這個點開始直接使用成員訪問。

  • 我應該有資格這樣的:它只產生串行一次緩存它在某些XmlSerializer的構造函數重載。對於其他人,每次創建序列化程序的實例時,都會重新生成序列化程序類。

只要您使用香草構造你好嗎:

XmlSerializer ser = new XmlSerializer(typeof(MyType)); 
1

原因很簡單,因爲它一直這樣,因爲第1天

此外,反思是昂貴的。爲什麼如果你不需要?

此外,XML序列化程序不是爲了序列化世界上的每個類。它旨在序列化設計爲序列化的類。因此,確保您想要的數據在公共字段和具有公共類無參數構造函數的公共類的屬性中承擔很大的負擔。

只有當你嘗試序列化一個沒有被設計爲序列化的類型時,你遇到了麻煩。

相關問題