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 desastre 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? Las respuestas JSON también contienen k_BackingField
serialization
asp.net-web-api
Miqueas
fuente
fuente
Respuestas:
De forma predeterminada, no es necesario utilizar
[Serializable]
ni[DataContract]
trabajar con Web API.Simplemente deje su modelo como está y la API web serializará todas las propiedades públicas por usted.
Solo si desea tener más control sobre lo que se incluye, luego decorará su clase
[DataContract]
y las propiedades con las que se incluirá[DataMember]
(porque tanto DCS como JSON.NET respetan 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.), entonces debe usar ambos atributos en conjunto para evitar los nombres de los campos de respaldo:fuente
Hay una solución más general: puede configurar el serializador Json para ignorar el
[Serializable]
atributo, de modo que no tenga que cambiar los atributos en sus clases.Debe realizar este cambio de configuración en el inicio de la aplicación, es decir, en el
Application_Start
evento Global.asax :También puede realizar otros cambios en la serialización de 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 API web, MVC JsonResult ...) no se verán afectadas por esta configuración.
fuente
Update-Package Newtonsoft.Json
.Intente usar DataContract en lugar de Serializable para marcar su clase. Para obtener más detalles sobre por qué, consulte esta buena publicación de blog sobre la serialización de propiedades automáticas.
fuente
Los atributos de [DataContract] no funcionaron para mí, por lo que no era una opción.
XmlSerializer ignora [XmlAttribute] en WebApi
La resolución anterior me lo resolvió.
fuente