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



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

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

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

但当使用.NET标准时,它不会。显然,当使用.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设置为true,因为默认情况下它是true这可以在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),
};

要回答您的具体问题,即在针对.NET Standard 2.0时,Json.NET v9.0.1中为什么不存在IgnoreSerializableAttribute,这是因为v9.0.1实际上只针对.NET Standard 1.0,而Microsoft的System.SerializableAttribute在.NET Standard 1.0中不存在。如果我还记得的话,MSFT将它作为二进制序列化的部分端口的一部分引入到.NET Standard 2.0中(现在已弃用(。当Json.NET在第11版中添加了对.NET Standard 2.0的支持时,就包含了对IgnoreSerializableAttribute的支持。

相关内容

  • 没有找到相关文章

最新更新