¿Cómo instancia la deserialización de WCF los objetos sin llamar a un constructor?

Hay algo mágico pasando con la deserialización de WCF. ¿Cómo crea una instancia de un tipo de contrato de datos sin llamar a su constructor?

Por ejemplo, considere este contrato de datos:

[DataContract] public sealed class CreateMe { [DataMember] private readonly string _name; [DataMember] private readonly int _age; private readonly bool _wasConstructorCalled; public CreateMe() { _wasConstructorCalled = true; } // ... other members here } 

Al obtener una instancia de este objeto a través de DataContractSerializer , verá que el campo _wasConstructorCalled es false .

Entonces, ¿cómo lo hace WCF? ¿Es esta una técnica que otros pueden usar también, o está escondida de nosotros?

FormatterServices.GetUninitializedObject() creará una instancia sin llamar a un constructor. Encontré esta clase usando Reflector y explorando algunas de las clases principales de serialización de .Net.

Lo probé usando el siguiente código de muestra y parece que funciona muy bien:

 using System; using System.Reflection; using System.Runtime.Serialization; namespace NoConstructorThingy { class Program { static void Main() { // does not call ctor var myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass)); Console.WriteLine(myClass.One); // writes "0", constructor not called Console.WriteLine(myClass.Two); // writes "0", field initializer not called } } public class MyClass { public MyClass() { Console.WriteLine("MyClass ctor called."); One = 1; } public int One { get; private set; } public readonly int Two = 2; } } 

http://sofes.miximages.com/c%23/687556261.png

Sí, FormatterServices.GetUninitializedObject () es la fuente de la magia.

Si quieres hacer una inicialización especial, mira esto. http://blogs.msdn.com/drnick/archive/2007/11/19/serialization-and-types.aspx