c# - sobrecarga - ¿Cómo instancia la deserialización de WCF los objetos sin llamar a un constructor?
herencia de constructores c# (2)
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
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://d3j5vwomefv46c.cloudfront.net/photos/large/687556261.png