从 .NET v4.7.2 切换到 .NET Standard v2.0 时,在 DefaultContractResolver 中找不到 IgnoreSerializableAttribute

IgnoreSerializableAttribute not found in DefaultContractResolver when switching from .NET v4.7.2 to .NET Standard v2.0

我正在将我们的一个库从 .NET v4.7.2 迁移到 .NET Standard v2.0。

此代码在使用 .NET v4.7.2 时编译

var resolver = new DefaultContractResolver
{
    IgnoreSerializableAttribute = true,
    NamingStrategy = new CamelCaseNamingStrategy(true, true),
};

但在使用 .NET Standard 时却没有。显然,在使用 .NET Standard 时,IgnoreSerializableAttribute 不是 Newtonsoft.Json v9.01 中 DefaultContractResolver 的一部分。

我使用的是 Newtonsoft.Json 的 v9.01,因为我们仍在使用 v1.0 Azure 函数,它们仅适用于 v9.01。

任何人都可以解释发生了什么以及为什么 .NET v4.7.2 中的 Newtonsoft.Json v9.01 和 .NET Standard v2.0 之间存在差异吗?

不需要设置IgnoreSerializableAttribute to true because it is true by default. This can be seen in the reference source for DefaultContractResolver:

       public DefaultContractResolver()
       {
#if HAVE_BINARY_SERIALIZATION
           IgnoreSerializableAttribute = true;
#endif

#pragma warning disable 618
           DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.Public;
#pragma warning restore 618

           _contractCache = new ThreadSafeStore<Type, JsonContract>(CreateContract);
       }

因此在 Json.NET 的所有版本上,以下代码将创建忽略 [Serializable] 属性的合同解析器:

var resolver = new DefaultContractResolver
{
    NamingStrategy = new CamelCaseNamingStrategy(true, true),
};

要回答您关于为什么 Json.NET v9.0.1 在面向 .NET Standard 2.0IgnoreSerializableAttribute 不存在的具体问题,这是因为v9.0.1 actually only targets .NET Standard 1.0, and Microsoft's System.SerializableAttribute did not exist in .NET Standard 1.0. If I recall, MSFT introduced it into .NET Standard 2.0 as part of the partial port of binary serialization (now deprecated). When Json.NET added support for .NET Standard 2.0 in release 11,包括对 IgnoreSerializableAttribute 的支持。