2012-03-19 26 views
0

我最近已經接觸到一些代碼,它始終如一地使用Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer(typeof(X))來創建一個新的序列化程序,其中X是被反序列化的對象的類型。在查找文檔時,大多數文檔都使用new XmlSerializer(typeof(X)),我幾乎找不到任何關於XmlSerializerContract的文檔(以及我發現的與Outlook有關的唯一官方文檔)。XmlSerializerContract.getSerializer()與新的XmlSerializer()

使用Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer()new XmlSerializer()相比有什麼好處?我想在哪些場景下使用每種場景?

回答

2

對於性能優化,XmlSerializer(和XmlSerializerFactory)生成包含特定類型的序列化程序的臨時程序集。您提到的類型(Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract)來自這些生成的程序集(請參閱http://treyhutcheson.wordpress.com/2007/02/20/dynamic-interface-implementations/) - 所以很自然,您還沒有找到相同的文檔。

坦率地說,對我來說,似乎是一些破解解決方案,可能會解決相關的XmlSerializer memory leak issues - 除非使用特定的構造函數,否則XmlSerializer將繼續生成更多動態程序集,從而增加內存佔用量。報價從MSDN上是相同的:

動態生成的裝配體

爲了提高性能,該XML序列化基礎結構 動態地生成組件序列化和反序列化 指定類型。基礎設施找到並重新使用這些程序集。使用下面的構造函數時只發生 此行爲:

XmlSerializer.XmlSerializer(類型)

XmlSerializer.XmlSerializer(類型,字符串)

如果你使用任何其他構造的,的多個版本 生成相同的程序集並且從不卸載,這會導致內存泄漏和性能不佳。最簡單的解決方案是使用前面提到的兩個構造函數中的一個 。否則,必須將 將程序集緩存在Hashtable中,如以下 示例所示。

我的建議將是當然的找出使用無證代碼生成的彙編從關注開發人員,但無論準備使用XmlSerializer/XmlSerializerFactory遷移來自同一遠離實際的理由 - 你可以隨時使用自己的緩存解決方案(如果你不使用這兩個特定的構造函數)。不要忘記嚴格測試你的代碼。

+0

令人驚歎的答案。感謝您提供如此詳盡的(且有據可查的)回覆!這極大地幫助了我。 – user937146 2012-03-19 08:20:23