DataContractSerializer不调用我的构造函数?

Tho*_*que 94 .net c# serialization constructor datacontractserializer

我刚刚意识到一些疯狂的东西,我认为这是完全不可能的:当反序列化一个对象时,DataContractSerializer不会调用构造函数!

以这门课为例,例如:

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我反序列化该类的对象时,不会触发断点.我完全不知道它是如何可能的,因为它是这个对象的唯一构造函数!

我假设编译器可能因为DataContract属性而生成了额外的构造函数,但我无法通过反射找到它...

所以,我想知道的是:如何在不调用构造函数的情况下创建我的类的实例?

注意:我知道OnDeserializing在反序列化开始时我可以使用该属性初始化我的对象,这不是我的问题的主题.

Mar*_*ell 130

DataContractSerializer(像BinaryFormatter)不使用任何构造函数.它将对象创建为空内存.

例如:

    Type type = typeof(Customer);
    object obj = System.Runtime.Serialization.
        FormatterServices.GetUninitializedObject(type);
Run Code Online (Sandbox Code Playgroud)

假设反序列化过程(或必要时的回调)将完全初始化它.

  • 这是骗人!! (88认同)
  • 我只是不确定为什么会出现这种功能.构造函数用于状态初始化.绕过那根本没有任何意义.应该允许无参数构造函数设置状态,无论它是否即将反序列化.如果他们想要一个特定的优化,就有StreamingContext构造函数. (10认同)
  • @Mranz反序列化也可以描述为状态初始化,简单地说:并非所有类型都具有无参数构造函数.在我自己的序列化程序中,我将此选项设为默认选项并禁用(仅限选择加入) (3认同)
  • @Dodu a:这不会导致泄漏 b:(调用 ctor)是很多序列化程序的工作方式;无论哪种方式通常都很好,因为行为被理解并且设计者因此而记录 (2认同)