net negotiation mvc frombody formatters content asp asp.net-mvc json serialization asp.net-web-api json.net

asp.net-mvc - mvc - content negotiation in web api



Hacer que JSON.NET y el atributo Serializable trabajen juntos (2)

Encontró la solución:

Primero, verifique que su versión de Newtonsoft.JSON sea mayor que 4.5 o simplemente actualice con NuGET

De acuerdo con las notas de la versión, ambos pueden trabajar juntos a partir de esta versión usando algunas anotaciones adicionales.

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

"Ahora, si está serializando tipos que tienen el atributo y no desea el nuevo comportamiento, puede anularse en un tipo usando el atributo JsonObjectAttribute"

[JsonObject] [Serializable] public class Foobar {

Ahora es posible usar JSON.NET y, en mi caso, el formato binario con el atributo [Serializable].

Estoy usando JSON.NET y tuve algunos problemas en el pasado durante la deserialización de objetos WEBAPI. Después de hacer algunas investigaciones, descubrí que la clase estaba marcada con [Serializable]. Cuando quité esto, la deserialización estaba bien.

Puede encontrar información más detallada sobre esto aquí:

¿Por qué la API web no deserializa esto pero JSON.Net lo hará?

Ahora se trata del problema de que utilizo binaryformatter para crear un valor de hash calculado a partir de esta clase de objeto. Pero Binaryformatter requiere que la clase se marque como [Serializable].

¿Podrías recomendarme algún enfoque para hacer que ambas cosas funcionen al mismo tiempo?


Una alternativa a la especificación de JsonObject en cada clase es decirle a web.api que ignore los atributos de Serialización globalmente. Esto se puede hacer restableciendo el DefaultContractResolver en la api web JsonFormatter:

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

(utilizando NewtonSoft.Json.Serialization donde config es System.Web.Http.HttpConfiguration)

A partir de NewtonSoft v4.5, la propiedad IgnoreSerializableAttribute en DefaultContractResolver se establece en true, pero el contenedor de la API web, alrededor de DefaultContractResolver, tiene este valor predeterminado en false.