我读过的很多地方都指出,在反序列化方面,.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
}

最佳答案

您正在反序列化json2字符串。

var json2 =
@"{
""Val1"":""hello""
}";


我不相信构造函数会被调用,但是JSON字符串会分配“ hello”。

关于c# - 构造函数不要求反序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5021973/

10-17 01:44