为什么XmlSerializer需要声明为public的序列化对象的类?

时间:2009-07-15 09:26:53

标签: c# .net xml-serialization

众所周知,为了能够使用XmlSerializer序列化您的对象,您必须将它们的类声明为public - 否则会出现InvalidOperationException。这里的问题是为什么?我Googled我发现XmlSerializer实际上生成并编译了一个全新的程序集,然后使用这个程序集来序列化你的对象。问题是,为什么它需要公开,同时使用反射很容易访问我的程序集中的内部类型?

2 个答案:

答案 0 :(得分:2)

很简单,因为它不使用反射来序列化/反序列化你的类 - 它直接访问公共属性(和类)。

使用refleciton来访问成员会非常昂贵,所以正如你在问题中提到的那样,它会使用反射生成一个序列化程序类,缓存它*,从这一点开始使用直接成员访问。

  • 我应该对此进行限定:它只生成一次序列化程序并为XmlSerializer上的某些构造函数重载缓存它。对于其他人,每次创建序列化程序的实例时,它都会重新生成序列化程序类。

只要您使用 vanilla 构造函数,您就可以了:

XmlSerializer ser = new XmlSerializer(typeof(MyType));

答案 1 :(得分:1)

原因很简单,因为从第1天开始就是这样。

此外,反思很昂贵。为什么这样做,如果你不需要?

此外,XML Serializer并非用于序列化世界上的每个类。它的目的是序列化设计为序列化的类。因此,确保所需数据位于具有公共无参数构造函数的公共类的公共字段和属性中并不是一个很大的负担。

只有在您尝试序列化一个非设计为序列化的类型时才会遇到麻烦。