衆所周知,爲了能夠使用XmlSerializer序列化對象,您必須將它們的類聲明爲public - 其次,您將得到InvalidOperationException。這裏的問題是爲什麼?我發現XmlSerializer實際上生成並編譯一個全新的程序集,然後使用這個程序集來序列化你的對象。問題是,爲什麼它要求類是公開的,而使用反射很容易在我的程序集中訪問內部類型?爲什麼XmlSerializer需要聲明爲public的序列化對象的類?
0
A
回答
2
很簡單,因爲它不使用反射來序列化/反序列化你的類 - 它直接訪問公共屬性(和類)。
使用refleciton訪問成員將是非常昂貴的,所以相反,正如你在你的問題中提到的那樣,它使用反射產生一個序列化類,緩存它*,並且從這個點開始直接使用成員訪問。
- 我應該有資格這樣的:它只產生串行一次緩存它在某些XmlSerializer的構造函數重載。對於其他人,每次創建序列化程序的實例時,都會重新生成序列化程序類。
只要您使用香草構造你好嗎:
XmlSerializer ser = new XmlSerializer(typeof(MyType));
1
原因很簡單,因爲它一直這樣,因爲第1天
此外,反思是昂貴的。爲什麼如果你不需要?
此外,XML序列化程序不是爲了序列化世界上的每個類。它旨在序列化設計爲序列化的類。因此,確保您想要的數據在公共字段和具有公共類無參數構造函數的公共類的屬性中承擔很大的負擔。
只有當你嘗試序列化一個沒有被設計爲序列化的類型時,你遇到了麻煩。
相關問題
- 1. 爲什麼序列化對象需要序列化
- 2. 爲什麼我的類型沒有被XmlSerializer正確序列化
- 3. 爲什麼它需要將類標記爲可序列化?
- 4. 爲什麼要將變量聲明爲新對象?
- 5. 爲什麼我的異常類需要序列化?
- 6. 爲什麼模板聲明中的size_t參數需要爲const?
- 7. 爲什麼對象傳遞是需要在類名爲python的
- 8. 爲什麼要對Json對象進行爆炸序列化?
- 9. 爲什麼CLR對象類型是可序列化的?
- 10. C#,爲什麼XmlSerializer會序列化基礎對象而不是接口?
- 11. 爲什麼聲明的順序對於靜態初始化器很重要?
- 12. 序列化對象作爲明文
- 13. 反序列化包含XmlSerializer對象列表的類(c#)
- 14. 爲什麼線程函數需要聲明爲'__cdecl'?
- 15. 需要聲明HttpServlet類爲抽象類型嗎?
- 16. 爲什麼需要使用標記接口來序列化對象?
- 17. 爲什麼需要抽象類?
- 18. 爲什麼反序列化'Type'類型的對象需要一個描述類型本身?
- 19. 爲什麼在我的屬性聲明「[field:NonSerialized]」中需要「field:」?
- 20. 爲什麼我們需要的java.sql聲明*包
- 21. 爲什麼GCC在模板中需要額外的聲明?
- 22. 如果將成員數據聲明爲原始數據類型,如果對象被聲明爲可序列化,那麼值會被序列化?
- 23. 對象作爲參數,爲什麼不能我們聲明的類,而不是
- 24. 爲什麼我們需要序列化的Web服務
- 25. XmlSerializer錯誤序列化接口對象
- 26. 爲什麼Swift中的類初始化期間不需要所有對象?
- 27. 爲什麼所有的屏幕對象方法都需要聲明爲虛擬的?
- 28. [HTML文檔類型聲明]:爲什麼我們需要聲明和聲明是否影響樣式?
- 29. 動態XmlSerializer標識xml序列化中的對象類型?
- 30. 序列化爲XML幷包含序列化對象的類型