好的,我们都知道在没有无参数构造函数的情况下不可能将XmlSerializer用于类,因为反序列化器将创建对象并设置所有属性。但是,通过使用Activator.CreateInstance(),可以在没有无参数构造函数的情况下实例化类。例如,我们可以实例化以下类:
public class Foo
{
public Foo(string bar){}
}
该类可以很容易地与Activator实现:
Activator.CreateInstance(typeof(Foo),"some string");
不幸的是,'Foo'无法使用XmlSerializer序列化,因为它没有无参数构造函数。为什么没有办法像这样使用XmlSerializer:
new XmlSerializer(typeof(Foo)).Deserialize(stream,"some string");
当然,我可以实现自己的Serializer,只需存储类型和所有适当的&对象的字段然后将使用Activator实例化对象并设置以前的存储属性。问题是:这有意义吗?我想必须有一个强有力的理由反对,否则这已经实施了,对吧?!?
答案 0 :(得分:1)
XmlSerializer
通过C#代码生成和动态编译工作;因为它使用C#编译器,所以它生成的代码必须编译 - 注意它必须遵循规则作为单独的程序集(没有internal
或private
访问权限。)
基本上,它想要使用new Foo()
,因为它实际上发出了C#代码"new Foo()"
,它被提供给编译器。
是的,它本可以选择使用不同的实例化技术,但是:new Foo()
是作者选择使用的 - 这是合理的默认设置。
其他一些序列化程序选择使用Activator
,而其他序列化程序仍然使用偷偷摸摸的IL技术,这些技术可以直接访问非公共方法而无需任何间接。