Сочетание атрибутов 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.