XmlSerializer& Activator.CreateInstance()

时间:2014-09-02 14:57:31

标签: c# serialization activator

好的,我们都知道在没有无参数构造函数的情况下不可能将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实例化对象并设置以前的存储属性。问题是:这有意义吗?我想必须有一个强有力的理由反对,否则这已经实施了,对吧?!?

1 个答案:

答案 0 :(得分:1)

XmlSerializer通过C#代码生成和动态编译工作;因为它使用C#编译器,所以它生成的代码必须编译 - 注意它必须遵循规则作为单独的程序集(没有internalprivate访问权限。)

基本上,它想要使用new Foo(),因为它实际上发出了C#代码"new Foo()",它被提供给编译器。

是的,它本可以选择使用不同的实例化技术,但是:new Foo()是作者选择使用的 - 这是合理的默认设置。

其他一些序列化程序选择使用Activator,而其他序列化程序仍然使用偷偷摸摸的IL技术,这些技术可以直接访问非公共方法而无需任何间接。