Как десериализация WCF создает объекты без вызова конструктора?

С десериализацией WCF происходит некоторая магия. Как он создает экземпляр типа контракта данных без вызова его конструктора?

Например, рассмотрите этот контракт:

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

При получении экземпляра этого объекта через DataContractSerializer вы увидите, что поле _wasConstructorCalled является false .

Итак, как это делает WCF? Это техника, которую другие могут использовать, или она скрыта от нас?

FormatterServices.GetUninitializedObject() создаст экземпляр без вызова конструктора. Я нашел этот class, используя Reflector и пробив некоторые из основных classов сериализации .Net.

Я тестировал его, используя пример кода ниже, и похоже, что он отлично работает:

 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://sofru.miximages.com/c%23/687556261.png

Да, FormatterServices.GetUninitializedObject () является источником магии.

Если вы хотите выполнить какую-либо специальную инициализацию, см. Это. http://blogs.msdn.com/drnick/archive/2007/11/19/serialization-and-types.aspx

  • Повысить накладные расходы на C ++
  • Использование GSON в Android для анализа сложного объекта JSON
  • Android - SharedPreferences с сериализуемым объектом
  • Почему я не мог сериализовать кортеж в C #?
  • Как работают атрибуты In и Out в .NET?
  • Json.Net добавляет $ id к объектам EF, несмотря на то, что PreserveReferencesHandling указывает на "None"
  • преобразование растрового изображения Java в байтовый массив
  • Проблема десериализации с помощью DataContractJsonSerializer
  • Каковы минусы отключения ProxyCreationEnabled для CTP5 кода EF
  • Как я сериализую объект и сохраняю его в файл на Android?
  • Как сохранить / восстановить сериализуемый объект в / из файла?
  • Давайте будем гением компьютера.