好吧,我们都知道,如果没有无参数的构造器,就不可能使用类的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实例化该对象并设置以前的存储属性。问题是:这有意义吗?我猜肯定有很强的理由反对,因为否则它就已经实现了,对吧?
发布于 2014-09-02 23:07:49
XmlSerializer通过C#代码生成和动态编译工作;因为它使用C#编译器,所以它生成的代码必须进行编译-请注意,它必须作为单独的程序集遵循规则(没有internal或private访问)。
基本上,它希望使用new Foo(),因为它从字面上发出C#代码"new Foo()",该代码被提供给编译器。
是的,它可以选择使用不同的实例化技术,但是:new Foo()是作者选择使用的-而且它是一个合理的默认值。
其他一些序列化程序选择使用Activator,而其他一些序列化程序仍然使用偷偷摸摸的IL技术,这些技术提供对非公共方法的直接访问,而不是任何间接的访问。
https://stackoverflow.com/questions/25626445
复制相似问题