87 votes

Sérialisation .NET WebAPI k_BackingField Nastiness

Quand je sérialiser ce qui suit:

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

Je reçois ce bordel dégueulasse:

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

Ce qui donne? Comment puis-je faire ça joli? Les réponses JSON contiennent également le k_BackingField

127voto

Filip W Points 13343

Par défaut, vous n'avez pas besoin d'utiliser ni [Serializable] ni [DataContract] de travailler avec l'API Web.

Il suffit de laisser votre modèle est, et de l'API Web serait de sérialiser toutes les propriétés publiques pour vous.

Seulement si vous voulez avoir plus de contrôle sur ce qui est inclus, vous de le décorer votre classe avec des [DataContract] et les propriétés devant être inclus avec [DataMember] (parce que les deux contrôleurs de domaine et JSON.NET respsect ces attributs).

Si pour une raison quelconque, vous avez besoin de l' [Serializable] sur votre classe (c'est à dire que vous êtes sérialisation dans un flux de mémoire pour une raison quelconque, faire une profonde copies, etc), alors vous devez utiliser à la fois des caractéristiques de concert pour empêcher la sauvegarde des noms de champ:

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

96voto

JotaBe Points 8950

Il n'y a plus de solution générale: vous pouvez configurer le Sérialiseur Json à ignorer l' [Serializable] d'attribut, de sorte que vous n'avez pas à modifier les attributs dans vos classes.

Vous devez faire ce changement de configuration au démarrage de l'application, c'est à dire Mondiale.asax Application_Start événement:

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

Vous pouvez également apporter d'autres modifications à la sérialisation Json, comme la définition des formats de sérialisation d'dates, et beaucoup d'autres choses.

Ce sera le seul applicable à l'API Web de la sérialisation JSON. Les autres serializations dans l'application (API Web de la sérialisation XML, MVC JsonResult...) ne seront pas affectées par ce paramètre.

2voto

Sixto Saez Points 9582

Essayez d’utiliser DataContract au lieu de Serializable pour marquer votre classe. Pour plus de détails sur pourquoi, consultez ce bon article de blog sur la sérialisation des propriétés automatiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X