首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlSerializer & Activator.CreateInstance()

XmlSerializer & Activator.CreateInstance()
EN

Stack Overflow用户
提问于 2014-09-02 22:57:31
回答 1查看 168关注 0票数 1

好吧,我们都知道,如果没有无参数的构造器,就不可能使用类的XmlSerializer,因为反序列化程序将创建对象并设置所有属性。但是,通过使用Activator.CreateInstance()可以在不使用无参数构造函数的情况下实例化类。例如,我们可以实例化以下类:

代码语言:javascript
复制
public class Foo
{
    public Foo(string bar){}
}

这个类可以很容易地用Activator实例化:

代码语言:javascript
复制
Activator.CreateInstance(typeof(Foo),"some string");

不幸的是,'Foo‘不能使用XmlSerializer序列化,因为它没有无参数的构造函数。为什么不能像这样使用XmlSerializer:

代码语言:javascript
复制
new XmlSerializer(typeof(Foo)).Deserialize(stream,"some string");

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

EN

回答 1

Stack Overflow用户

发布于 2014-09-02 23:07:49

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

基本上,它希望使用new Foo(),因为它从字面上发出C#代码"new Foo()",该代码被提供给编译器。

是的,它可以选择使用不同的实例化技术,但是:new Foo()是作者选择使用的-而且它是一个合理的默认值。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25626445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档