2012-09-08 15 views
74

Cuando i serializar el siguiente:.NET WebAPI serialización k_BackingField Nastiness

[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 repugnante:

<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? respuestas JSON también contienen el k_BackingField

+0

Esto me ayudó: http://stackoverflow.com/questions/15388452/access-the-default-json-net-serializer-in-asp-net-web-api – granadaCoder

Respuesta

109

De forma predeterminada, no es necesario utilizar [Serializable] ni [DataContract] para trabajar con la API web.

acaba de salir de su modelo tal como está, y la API de Web habría serializar todas las propiedades públicas para usted.

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

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

[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; } 
} 
+6

Eso fue todo, solo necesitaba eliminar el [Serializable]. Gracias. – Micah

+0

Gracias Filip, tengo que mantener los atributos debido a la memoria caché ... Por cierto, soy un ávido fanático de tu blog ... ¡sigue haciéndolo! –

+0

jaja muchas gracias! –

79

hay una solución más general: se puede configurar el JSON serializador ignorar el atributo [Serializable], de modo que usted no tiene que cambiar los atributos en sus clases.

Usted debe hacer este cambio de configuración en el inicio de la aplicación, es decir, en Global.asax Application_Start evento:

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 la especificación de formatos para serializar fechas, y muchos otras cosas.

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

+2

Esta solución me ayudó ... ¡dos veces! Y lo había olvidado en el medio. –

+2

Me gusta mucho más esta solución que agregar los atributos [DataContract] y [DataMember] en todas partes. ¡¡Gracias!! –

+0

¡Impresionante, funciona como un encanto! – Roemer

Cuestiones relacionadas