DataContractSerializer不会调用我的构造函数?
我只是意识到一些疯狂的东西,我认为这是完全不可能的:当反序列化一个对象时, DataContractSerializer不会调用构造函数 !
以这个class级为例:
[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
属性,编译器生成了一个额外的构造函数,但我无法通过reflectionfind它…
所以,我想知道的是:如何创build我的类的实例,而不需要调用构造函数?
注:我知道,我可以使用OnDeserializing
属性来初始化我的对象,当反序列化开始时,这不是我的问题的主题。
DataContractSerializer
(如BinaryFormatter
)不使用任何构造函数。 它将该对象创build为空内存。
例如:
Type type = typeof(Customer); object obj = System.Runtime.Serialization. FormatterServices.GetUninitializedObject(type);
假设是反序列化过程(或者必要时的callback)将完全初始化它。
有一些情况下,没有这种行为是不可能的。 想想以下几点:
1)您有一个对象具有一个构造函数,将新实例设置为“初始化”状态。 然后在该实例上调用一些方法,使其处于“已处理”状态。 你不想创build具有“已处理”状态的新对象,但是你仍然想要序列化/反序列化实例。
2)您创build了一个具有私有构造函数和一些静态属性的类来控制一小组允许的构造函数参数。 现在你仍然可以序列化/反序列化它们。
XmlSerializer具有您所期望的行为。 我有一些XmlSerializer的问题,因为它需要一个默认的构造函数。 与此相关的是,有时私人财产制定者是有道理的。 但是XmlSerializer也需要属性的public getter和setter来进行序列化/反序列化。
我想到了DataContractSerializer / BinaryFormatter行为,例如在序列化过程中暂停实例的状态以及在反序列化过程中恢复。 换句话说,这些实例不是“构build”的,而是“恢复”到较早的状态。
正如您已经提到的,[OnDeserializing]属性可以保持非序列化的数据同步。