繁体   English   中英

XmlSerializer和Activator.CreateInstance()

[英]XmlSerializer & Activator.CreateInstance()

好的,我们都知道,对于没有无参数构造函数的类,不能对XmlSerializer使用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");

当然,我可以实现自己的序列化程序,该序列化程序将简单地存储对象的类型以及所有属性和字段,然后使用Activator实例化该对象并设置先前存储的属性。 问题是:这有意义吗? 我想肯定有一个很强的理由反对,因为否则将已经实施,对吗?

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

基本上,它想使用new Foo() ,因为它从字面上发出C#代码"new Foo()" ,该代码被馈送到编译器。

是的,它可能选择使用其他实例化技术,但是:作者选择使用new Foo() -这是一个合理的默认值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM