使用 XmlSerializer.Deserialize 反序列化时何时调用类构造函数?

Posted

技术标签:

【中文标题】使用 XmlSerializer.Deserialize 反序列化时何时调用类构造函数?【英文标题】:When is the class constructor called while deserialising using XmlSerializer.Deserialize? 【发布时间】:2011-07-09 01:53:26 【问题描述】:

我的应用程序使用 XmlSerializer 保存一个类,然后在需要时通过再次反序列化它来创建一个实例。 我想在我的构造函数逻辑中使用我的类的一些属性成员(在反序列化期间分配)。可以假设先赋值属性,等所有属性赋值后调用构造函数?

继续讨论这个话题,是否有任何关于反序列化期间发生的事件顺序的文档?

【问题讨论】:

【参考方案1】:

不,假设属性将在构造函数运行时设置是不正确的。反之亦然。构造函数是创建对象实例时运行的第一段代码。在构造函数开始执行之前,无法设置属性。

XML反序列化过程大致如下所示

调用无参数构造函数 将属性设置为其反序列化值

解决此问题的一种方法是使用工厂方法进行反序列化,然后运行取决于所设置属性的逻辑。例如

class MyClass 
  ...
  public static MyClass Deserialize(string xmlContents) 
    var local = ... // Do the XML deserialization
    local.PostCreateLogic();
    return local;
  

【讨论】:

XmlSerializer 确实如此,但有些序列化程序在反序列化对象时根本不调用构造函数。 ***.com/q/9419743/141172【参考方案2】:

构造函数是你的对象的创建。您的对象需要在分配属性值之前创建。然后,会先调用构造函数。

我不知道该序列的任何文档。但是如果你的类不是那么大,可以添加一些断点,你会看到哪个事件是第一个。

【讨论】:

以上是关于使用 XmlSerializer.Deserialize 反序列化时何时调用类构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)