为何JsonConvert序列化C#对象会改变属性顺序?
问题:JsonConvert序列化属性顺序异常,与反射代码相关
我定义了如下C#类:
public class TxtFileDTO { public object Field01 { get; set; } public object Field02 { get; set; } public object Field03 { get; set; } }
使用JsonConvert.SerializeObject序列化该类对象时,属性顺序被改变,Field02排在了Field01之前。我不想在原类中添加JSON排序注解,且移除序列化前执行的如下反射代码后,序列化顺序恢复正常:
var valueoffield = txtFileDTO.GetType().GetProperty("PropertyName").GetValue(txtFileDTO);
请问出现该问题的原因是什么?
原因分析
- .NET的CLR在首次通过反射访问类型成员(比如调用
GetProperty)时,会触发类型成员的即时编译(JIT),这个过程会修改CLR内部维护的成员缓存顺序。 - Newtonsoft.Json默认会优先读取CLR内部缓存的成员信息来进行序列化,而不是严格按照类定义的顺序解析成员。
- 当你执行那段反射代码时,CLR的成员缓存顺序被提前修改,导致Newtonsoft.Json读取到的属性顺序和类定义不一致;移除反射代码后,CLR没有提前调整缓存顺序,Newtonsoft.Json就会按照类原本的定义顺序完成序列化。
内容的提问来源于stack exchange,提问作者Nirosh Sns
相关产品推荐
相关产品推荐

