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

从.NET v4.7.2迁.NET Standard 2.0时Newtonsoft.Json 9.0.1找不到IgnoreSerializableAttribute

问题根因说明

你所遇到的编译报错是Newtonsoft.Json v9.0.1版本针对不同目标框架做了差异化构建直接导致的,具体原因如下:

  1. 面向.NET Framework 4.7.2构建的Newtonsoft.Json v9.0.1程序集中,确实包含DefaultContractResolver.IgnoreSerializableAttribute属性。因为.NET Framework原生完整支持[Serializable]特性以及配套的序列化语义,该属性用于控制序列化时是否忽略类上的[Serializable]标记对Json序列化规则的影响。
  2. 面向.NET Standard 2.0构建的Newtonsoft.Json v9.0.1程序集中,该属性被完全移除。在v9.0.1发布的2016年,.NET Standard 2.0的官方API规范还未将SerializableAttribute以及相关的序列化语义纳入兼容范围,Newtonsoft.Json开发团队通过条件编译指令,直接剔除了.NET Standard构建分支中所有和[Serializable]特性相关的代码逻辑,包括IgnoreSerializableAttribute属性,因此在.NET Standard 2.0项目中引用该版本包时就会找不到该属性触发编译错误。
同版本跨框架API差异的底层逻辑

同一个NuGet包版本在不同目标框架下出现API不一致,本质是NuGet多目标构建机制的产物:

  • 主流.NET类库都会采用多目标构建策略,同一个包版本内包含多个针对不同.NET平台(.NET Framework、.NET Standard、.NET Core等)单独编译的程序集,NuGet安装包时会自动选择和当前项目目标框架最匹配的程序集版本。
  • Newtonsoft.Json v9.0.1的代码库中,所有和IgnoreSerializableAttribute相关的实现都被#if条件编译指令包裹,仅当目标框架满足「支持完整SerializableAttribute语义」的条件时,才会被编译到最终输出的程序集中。
  • .NET Standard是API规范而非运行时实现,不同时期的.NET Standard版本包含的API范围不同,v9.0.1发布时.NET Standard 2.0尚未支持SerializableAttribute,因此对应构建分支中该属性的代码被跳过编译,最终就出现了同版本包在不同框架下API不一致的情况。

若受Azure Functions v1.0限制无法升级Newtonsoft.Json版本,可直接移除IgnoreSerializableAttribute = true的赋值,.NET Standard 2.0环境下Newtonsoft.Json v9.0.1默认就不会处理[Serializable]特性,和原有配置效果完全一致。

内容的提问来源于stack exchange,提问作者sixeyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:09:06