В различных местах, которые я читал, указывалось, что при десериализации .NET Framework вызывает FormatterServices.GetUninitializedObject , в котором конструкторы не вызываются и инициализаторы полей не устанавливаются.Если это правда, почему мой конструктор вызывается?Существуют ли случаи, когда конструкторы и инициализаторы полей могут вызываться?
Мой класс:
[DataContract]
public class TestClass
{
[DataMember]
public string Val1 { get; set; }
[DataMember]
public string Val2 { get; set; }
[DataMember]
public bool NonDefaultBool = true;
private int _nonDefaultInt = 1234;
[DataMember]
public int NonDefaultInt
{
get { return _nonDefaultInt; }
set { _nonDefaultInt = value; }
}
public TestClass()
{
Val1 = "hello";
}
}
Мой код де / сериализации:
var json2 =
@"{
""Val1"":""hello""
}";
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json2)))
{
var thing = DeserializeJsonObject<TestClass>(ms);
Console.WriteLine(GetSerializedData(thing));
}
// ... code left out
protected static TModel DeserializeJsonObject<TModel>(Stream data) where TModel : class
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(TModel));
return jsonSerializer.ReadObject(data) as TModel;
}
static string GetSerializedData<T>(T data)
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T), _knownTypes);
using (MemoryStream ms = new MemoryStream())
{
jsonSerializer.WriteObject(ms, data);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
Мой вывод (отформатированный и прокомментированный мной):
{
"NonDefaultBool":false, // field initializer not set
"NonDefaultInt":0, // field initializer not set
"Val1":"hello", // constructor called
"Val2":null
}