You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 18:05:00