validate net fromuri frombody asp serialization asp.net-web-api

serialization - net - web api mediatypeformatter



.NET WebAPI Serialización k_BackingField Nastiness (3)

De manera predeterminada, no necesita usar ni [Serializable] ni [DataContract] para trabajar con Web API.

Simplemente deje su modelo como está, y Web API serializaría todas las propiedades públicas por usted.

Solo si desea tener más control sobre lo que está incluido, entonces decore su clase con [DataContract] y las propiedades que se incluirán con [DataMember] (porque DCS y JSON.NET respsect estos atributos).

Si por alguna razón necesita el [Serializable] en su clase (es decir, lo está serializando en una secuencia de memoria por alguna razón, haciendo copias profundas, etc.), entonces tiene que usar ambos atributos para evitar los nombres de campo de respaldo:

[Serializable] [DataContract] public class Error { [DataMember] public string Status { get; set; } [DataMember] public string Message { get; set; } [DataMember] public string ErrorReferenceCode { get; set; } [DataMember] public List<FriendlyError> Errors { get; set; } }

Cuando serializo lo siguiente:

[Serializable] public class Error { public string Status { get; set; } public string Message { get; set; } public string ErrorReferenceCode { get; set; } public List<FriendlyError> Errors { get; set; } }

Me sale este lío asqueroso:

<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api"> <_x003C_Errors_x003E_k__BackingField> An exception has occurred. Please contact printmee support </_x003C_Errors_x003E_k__BackingField> <_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField> </ErrorRootOfstring>

¿Lo que da? ¿Cómo puedo hacer esto bonito? Las respuestas JSON también contienen el k_BackingField


Hay una solución más general: puede configurar el Json Serializer para ignorar el atributo [Serializable] , para que no tenga que cambiar los atributos en sus clases.

Debe hacer que esta configuración cambie en el inicio de la aplicación, es decir, en el evento Global.asax Application_Start :

var serializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; var contractResolver = (DefaultContractResolver)serializerSettings.ContractResolver; contractResolver.IgnoreSerializableAttribute = true;

También puede realizar otros cambios en la serialización Json, como especificar formatos para serializar fechas, y muchas otras cosas.

Esto solo se aplicará a la serialización JSON de la API web. Las otras serializaciones en la aplicación (serialización XML de Web API, MVC JsonResult ...) no se verán afectadas por esta configuración.