Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataContractSerializer doesn't call my constructor?

I just realized something crazy, which I assumed to be completely impossible : when deserializing an object, the DataContractSerializer doesn't call the constructor !

Take this class, for instance :

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

When I deserialize an object of that class, the breakpoint is not hit. I have absolutely no idea how it is possible, since it is the only constructor for this object !

I assumed that perhaps an additional constructor was generated by the compiler because of the DataContract attribute, but I couldn't find it through reflection...

So, what I'd like to know is this : how could an instance of my class be created without the constructor being called ??

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

like image 390
Thomas Levesque Avatar asked Jul 02 '09 21:07

Thomas Levesque


1 Answers

DataContractSerializer (like BinaryFormatter) doesn't use any constructor. It creates the object as empty memory.

For example:

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

The assumption is that the deserialization process (or callbacks if necessary) will fully initialize it.

like image 158
Marc Gravell Avatar answered Sep 22 '22 02:09

Marc Gravell