众所周知,为了能够使用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并包含序列化对象的类型