使JSON.NET和Serializable属性协同工作

Jav*_*ier 17 asp.net-mvc serialization json json.net asp.net-web-api

我正在使用JSON.NET,并且在WEBAPI对象反序列化过程中遇到了一些麻烦.经过一些研究后,我发现该课程标有[Serializable].当我删除它时,反序列化就好了.

有关这方面的更多详细信息,请访问:

为什么Web API不会反序列化,但JSON.Net会?

现在谈到我使用binaryformatter来创建从这个对象类计算的哈希值的问题.但Binaryformatter要求必须将类标记为[Serializable].

您能否推荐我任何方法让两件事同时发挥作用?

Jav*_*ier 24

找到解决方案:

首先,检查您的Newtonsoft.JSON版本是否大于4.5或仅使用NuGET进行更新

根据版本说明,两者都可以使用一些额外的注释从这个版本开始协同工作.

http://james.newtonking.com/archive/2012/04/11/json-net-4-5-release-2-serializable-support-and-bug-fixes

"现在,如果您序列化具有该属性但不想要新行为的类型,则可以使用JsonObjectAttribute在类型上覆盖它"

[JsonObject]
[Serializable]
public class Foobar {
Run Code Online (Sandbox Code Playgroud)

现在可以使用JSON.NET,在我的例子中,可以使用带有[Serializable]属性的binaryformatter.


Mar*_*ski 5

在每个类上指定JsonObject的替代方法是告诉web.api全局忽略Serialize属性.这可以通过重置web api JsonFormatter上的DefaultContractResolver来完成:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
Run Code Online (Sandbox Code Playgroud)

(使用NewtonSoft.Json.Serialization,其中config是System.Web.Http.HttpConfiguration)

从NewtonSoft v4.5开始,DefaultContractResolver上的IgnoreSerializableAttribute属性设置为true,但默认情况下,默认情况下,围绕DefaultContractResolver的web api包装器设置为false.