从.NET v4.7.2迁.NET Standard 2.0时Newtonsoft.Json 9.0.1找不到IgnoreSerializableAttribute
问题根因说明
你所遇到的编译报错是Newtonsoft.Json v9.0.1版本针对不同目标框架做了差异化构建直接导致的,具体原因如下:
- 面向.NET Framework 4.7.2构建的Newtonsoft.Json v9.0.1程序集中,确实包含
DefaultContractResolver.IgnoreSerializableAttribute属性。因为.NET Framework原生完整支持[Serializable]特性以及配套的序列化语义,该属性用于控制序列化时是否忽略类上的[Serializable]标记对Json序列化规则的影响。 - 面向.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
相关产品推荐
相关产品推荐

