Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataContractSerializer如何反序列化只读字段?_C#_.net_Serialization_Reflection_Datacontractserializer - Fatal编程技术网

C# DataContractSerializer如何反序列化只读字段?

C# DataContractSerializer如何反序列化只读字段?,c#,.net,serialization,reflection,datacontractserializer,C#,.net,Serialization,Reflection,Datacontractserializer,DataContractSerializer将愉快地反序列化此类,包括只读字段: [DataContract] public class A { public A(int rof) => Rof = rof; [DataMember] private readonly int Rof; } 它是怎么做到的?它以速度快著称,所以我认为它不使用FieldInfo.SetValue(),是吗 Expression.Assign()似乎不起作用,发出StfldStfld

DataContractSerializer
将愉快地反序列化此类,包括只读字段:

[DataContract]
public class A
{
    public A(int rof) => Rof = rof;

    [DataMember]
    private readonly int Rof;
}
它是怎么做到的?它以速度快著称,所以我认为它不使用
FieldInfo.SetValue()
,是吗


Expression.Assign()
似乎不起作用,发出
Stfld

Stfld
也不起作用,如果您愿意的话。
DataContractSerializer
生成委托来构造实例,并通过使用中的工具(特别是中的工具)生成MSIL来读取和设置所有类成员。要了解这是如何完成的,在参考源中,您可以从开始浏览。要实际设置字段的值,它似乎是
ilGen.Emit(OpCodes.Stfld,fieldInfo),请参阅。事实上protobuf net是通过假装该方法在字段的声明类型内来实现的。@dbc如果它是一个答案,我会接受它。所以我认为发射Stfld是正确的,但是我将它发射到一个新的类型,而不是与类型a相关联的DynamicMethod。它是这样工作的。