2009-07-15 72 views
0

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

回答

2

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

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

  • 我应该有资格这样的:它只产生串行一次缓存它在某些XmlSerializer的构造函数重载。对于其他人,每次创建序列化程序的实例时,都会重新生成序列化程序类。

只要您使用香草构造你好吗:

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

原因很简单,因为它一直这样,因为第1天

此外,反思是昂贵的。为什么如果你不需要?

此外,XML序列化程序不是为了序列化世界上的每个类。它旨在序列化设计为序列化的类。因此,确保您想要的数据在公共字段和具有公共类无参数构造函数的公共类的属性中承担很大的负担。

只有当你尝试序列化一个没有被设计为序列化的类型时,你遇到了麻烦。

相关问题