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

C# 使用XmlSerializer.Deserialize进行反序列化时何时调用类构造函数?,c#,.net,xmlserializer,xml-deserialization,C#,.net,Xmlserializer,Xml Deserialization,我的应用程序使用XmlSerializer保存一个类,然后在需要时,通过再次反序列化创建一个实例。 我想在构造函数逻辑中使用类的一些属性成员(在反序列化期间分配)。假设首先分配属性是可以的,一旦分配了所有属性,会调用构造函数吗 继续本主题,是否有任何关于反序列化过程中发生的事件序列的文档可用?不可以假设在构造函数运行时将设置属性。事实恰恰相反。构造函数是创建对象实例时运行的第一段代码。在构造函数开始执行之前,无法设置属性 XML反序列化过程大致如下所示 调用无参数构造函数 将属性设置为其反序列

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


继续本主题,是否有任何关于反序列化过程中发生的事件序列的文档可用?

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

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

  • 调用无参数构造函数
  • 将属性设置为其反序列化的值
解决这一问题的一种方法是使用工厂方法进行反序列化,然后根据所设置的属性运行逻辑。比如说

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

构造函数是对象的创建。在指定属性值之前,需要创建对象。然后,将首先调用构造函数


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

对于XmlSerializer来说,这是正确的,但是有些序列化程序在反序列化对象时根本不调用构造函数。