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)使用了code>,请参阅。事实上protobuf net是通过假装该方法在字段的声明类型内来实现的。@dbc如果它是一个答案,我会接受它。所以我认为发射Stfld是正确的,但是我将它发射到一个新的类型,而不是与类型a相关联的DynamicMethod。它是这样工作的。