【问题标题】:XmlSerializer & Activator.CreateInstance()XmlSerializer & Activator.CreateInstance()
【发布时间】:2014-09-02 14:57:30
【问题描述】:

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

当然,我可以实现我自己的序列化器,它只存储对象的类型和所有属性和字段,然后使用激活器实例化对象并设置以前存储的属性。问题是:这有意义吗?我想一定有一个强有力的理由反对,否则那已经实施了,对吧?!?

【问题讨论】:

  • 请注意,对于要实施的功能,应该有“强烈的理由支持”,而不是“反对” - 请参阅Minus 100 points。涵盖非常狭窄的情况(如您所建议的)的东西很少能获得足够的“点”来实施。
  • 就我个人而言,我认为重新发明轮子并不像使用现有的完善的解决方案(如 protobuf-net,它没有这些限制)那么有趣。
  • @Haney - 不是相反吗?重新发明轮子是最有趣的......否则为什么每个人都实现他们自己的日志框架......
  • @Haney 现在稳住了,你会让我脸红的......
  • @AlexeiLevenkov 我想这取决于你是否是一个内心的“修补匠”。但是当存在很多很多可行的替代方案时编写一个新的序列化程序似乎相对多余。马克 - 不涉及任何偏见。我推荐 protobuf-net 的唯一原因是 A) 我在过去的项目中非常成功地使用了它,并且 2) 它比 XmlSerializer 更快、更容易、更灵活。我被XmlSerializer咬了很多次,我害怕。

标签: c# serialization activator


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多