Quando eu serializo o seguinte:
[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; }
}
Eu fico com essa bagunça nojenta:
<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>
O que da? Como posso deixar isso bonito? As respostas JSON também contêm o k_BackingField
Respostas:
Por padrão, você não precisa usar
[Serializable]
nem[DataContract]
trabalhar com Web API.Basta deixar seu modelo como está, e a API da Web serializará todas as propriedades públicas para você.
Apenas se quiser ter mais controle sobre o que está incluído, você então decora sua classe com
[DataContract]
e as propriedades a serem incluídas[DataMember]
(porque DCS e JSON.NET refletem esses atributos).Se, por algum motivo, você precisar do
[Serializable]
em sua classe (ou seja, você está serializando-o em um fluxo de memória por algum motivo, fazendo cópias profundas etc.), você deve usar os dois atributos em conjunto para evitar os nomes dos campos de apoio:fonte
Existe uma solução mais geral: você pode configurar o Json Serializer para ignorar o
[Serializable]
atributo, de forma que você não precise alterar os atributos em suas classes.Você deve fazer essa alteração de configuração no início do aplicativo, ou seja, no
Application_Start
evento Global.asax :Você também pode fazer outras alterações na serialização Json, como especificar formatos para serializar datas e muitas outras coisas.
Isso se aplica apenas à serialização JSON da API da Web. As outras serializações no aplicativo (serialização XML da API da Web, MVC JsonResult ...) não serão afetadas por esta configuração.
fonte
Update-Package Newtonsoft.Json
.Tente usar DataContract em vez de Serializable para marcar sua classe. Para obter mais detalhes sobre o motivo, consulte esta boa postagem no blog sobre serialização de propriedades automáticas.
fonte
Os atributos [DataContract] não funcionavam para mim, então não era uma opção.
XmlSerializer ignora [XmlAttribute] em WebApi
A resolução acima resolveu para mim.
fonte