我刚刚意识到一些疯狂的事情,我认为这是完全不可能的:当反序列化一个对象时,DataContractSerializer doesn't call the constructor

以这门课为例:

[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; }
}

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

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

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

NOTE: I know that I can use the 100 attribute to initialize my object when deserialization begins, this is not the subject of my question.

推荐答案

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

例如:

    Type type = typeof(Customer);
    object obj = System.Runtime.Serialization.
        FormatterServices.GetUninitializedObject(type);

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

.net相关问答推荐

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

类似于字典但没有值的 C# 数据 struct

根源是什么?

比较 C# 中的双精度值

我应该默认推荐密封类吗?

如何在 C# 中直接执行 SQL 查询?

实体框架无法加载指定的元数据资源

如何让 .NET 的 Path.Combine 将正斜杠转换为反斜杠?

Mono 是树莓派

当程序员说针对接口而不是对象的代码时,他们是什么意思?

互锁且易变

多个添加的实体可能具有相同的主键

形成两个列表并集的最简单方法

mscorlib 代表什么?

DataGridView 在我的两个屏幕之一上的可怕重绘性能

将字典值转换为数组

CI服务器的比较?

如何从其十六进制 RGB 字符串创建 System.Drawing.Color?

如何判断uri字符串是否有效

不签署 .NET 程序集有什么问题吗?