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.
"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.