Сочетание атрибутов JSON.NET и Serializable

Я использую JSON.NET и имел некоторые проблемы в прошлом при десериализации объектов WEBAPI. Проведя некоторое исследование, я обнаружил, что класс был отмечен [Serializable]. Когда я удалил это, десериализация была просто прекрасна.

Более подробную информацию об этом можно найти здесь:

Почему веб-API не десериализует это, а JSON.Net будет?

Теперь дело доходит до того, что я использую двоичный формат для создания хеш-значения, вычисленного из этого класса объектов. Но Binaryformatter требует, чтобы класс был помечен как [Serializable].

Не могли бы вы порекомендовать мне какой-нибудь подход, чтобы обе работали одновременно?

Ответы

Ответ 1

Найдено решение:

Во-первых, убедитесь, что ваша версия 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 {

Теперь можно использовать JSON.NET и, в моем случае, двоичный формат с атрибутом [Serializable].

Ответ 2

Альтернативой заданию JsonObject для каждого класса является указание web.api игнорировать атрибуты Serialize во всем мире. Это можно сделать, сбросив DefaultContractResolver в веб-api JsonFormatter:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

(используя NewtonSoft.Json.Serialization, где config - System.Web.Http.HttpConfiguration)

Как и в случае с NewtonSoft v4.5, свойство IgnoreSerializableAttribute в DefaultContractResolver имеет значение true, но оболочка web api, вокруг DefaultContractResolver, по умолчанию имеет значение false.