我正在将我们的一个库从.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
的支持。