【问题标题】:Why does XmlSerializer requires the classes of the serialized object declared as public?为什么 XmlSerializer 需要声明为公共的序列化对象的类?
【发布时间】:2010-11-10 22:45:52
【问题描述】:
众所周知,为了能够使用 XmlSerializer 序列化您的对象,您必须将它们的类声明为公共的 - 否则您会收到 InvalidOperationException。这里的问题是为什么?我Googled 发现 XmlSerializer 实际上生成并编译了一个全新的程序集,然后使用该程序集序列化您的对象。问题仍然是,为什么它要求类是公共的,而使用反射很容易访问我的程序集中的内部类型?
【问题讨论】:
标签:
c#
.net
xml-serialization
【解决方案1】:
很简单,因为它不使用反射来序列化/反序列化您的类 - 它直接访问公共属性(和类)。
使用反射来访问成员将非常昂贵,因此,正如您在问题中提到的那样,它使用反射生成一个序列化程序类,缓存它*,然后使用直接成员访问。
- 我应该对此进行限定:它只生成一次序列化程序并为 XmlSerializer 上的某些构造函数重载缓存它。对于其他人,它会在您每次创建序列化程序实例时重新生成序列化程序类。
只要你使用 vanilla 构造函数就可以了:
XmlSerializer ser = new XmlSerializer(typeof(MyType));
【解决方案2】:
原因很简单,因为从第一天开始就是这样。
此外,反射很昂贵。如果不需要,为什么要这样做?
此外,XML 序列化器并非旨在序列化世界上的每个类。它旨在序列化设计为序列化的类。因此,确保您想要的数据位于具有公共无参数构造函数的公共类的公共字段和属性中并不是很大的负担。
只有当您尝试序列化并非设计为可序列化的类型时才会遇到麻烦。