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