J’ai essayé de sérialiser la classe POCO qui a été généré automatiquement d’Entity Data Model .edmx et quand j’ai utilisé
J’ai obtenu l’erreur suivante :
Comment puis-je résoudre ce problème ? Toutes les idées ? Merci d’avance !
J’ai essayé de sérialiser la classe POCO qui a été généré automatiquement d’Entity Data Model .edmx et quand j’ai utilisé
J’ai obtenu l’erreur suivante :
Comment puis-je résoudre ce problème ? Toutes les idées ? Merci d’avance !
C'était la meilleure solution http://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7
Solution 1: le non-respect de la circulaire de référence à l'échelle mondiale (j'ai choisi/essayé celui-ci)
json.net sérialiseur prend en charge à ignorer la circulaire de référence sur le paramètre global. Une solution rapide est de mettre le code suivant dans WebApiConfig.cs fichier:
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Ignore;
La seule solution sera de faire sérialiseur pour ignorer la référence qui sera la cause d'une boucle. Cependant, il a des limites:
Les données perd la boucle d'information de référence Le correctif s'applique uniquement aux JSON.net Le niveau de références ne peut pas être contrôlée si il y a une profonde chaîne de référence Solution 2: la Préservation de la circulaire de référence à l'échelle mondiale
Cette deuxième solution est semblable à la première. Il suffit de changer le code pour:
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Serialize;
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling
= Newtonsoft.Json.PreserveReferencesHandling.Objects;
La forme des données sera changé après l'application de ce paramètre.
[
{
"$id":"1",
"Category":{
"$id":"2",
"Products":[
{
"$id":"3",
"Category":{
"$ref":"2"
},
"Id":2,
"Name":"Yogurt"
},
{
"$ref":"1"
}
],
"Id":1,
"Name":"Diary"
},
"Id":1,
"Name":"Whole Milk"
},
{
"$ref":"3"
}
]
Le $id et $ref conserve toutes les références et fait l'objet graphique de niveau plat, mais le code du client a besoin de savoir la modification de la forme à exploiter les données et il s'applique uniquement aux JSON.NET sérialiseur.
Corrigé 3: Ignorer et de préserver les attributs de référence
Ce correctif est à décorer les attributs de la classe du modèle pour contrôler la sérialisation comportement sur le modèle ou le niveau de la propriété. Pour ignorer la propriété:
1: public class Category
2: {
3: public int Id { get; set; }
4: public string Name { get; set; }
5:
6: [JsonIgnore]
7: [IgnoreDataMember]
8: public virtual ICollection<Product> Products { get; set; }
9: }
JsonIgnore est pour JSON.NET et IgnoreDataMember est pour XmlDCSerializer. Pour préserver référence:
1: // Fix 3
2: [JsonObject(IsReference = true)]
3: public class Category
4: {
5: public int Id { get; set; }
6: public string Name { get; set; }
7:
8: // Fix 3
9: //[JsonIgnore]
10: //[IgnoreDataMember]
11: public virtual ICollection<Product> Products { get; set; }
12: }
13:
14: [DataContract(IsReference = true)]
15: public class Product
16: {
17: [Key]
18: public int Id { get; set; }
19:
20: [DataMember]
21: public string Name { get; set; }
22:
23: [DataMember]
24: public virtual Category Category { get; set; }
25: }
[JsonObject ('IsReference = true)] est pour JSON.NET et [DataContract ('IsReference = true)] est pour XmlDCSerializer. Remarque: après l'application de DataContract de la classe, vous devez l'ajouter DataMember de propriétés que vous souhaitez sérialiser.
Les attributs peuvent être appliqués sur les deux json et xml sérialiseur et donne plus de contrôle sur le modèle de la classe.
Utilisation JsonSerializerSettings
ReferenceLoopHandling.Error
(par défaut) erreur si une boucle de référence est rencontré. C'est pourquoi vous obtenez une exception.
ReferenceLoopHandling.Serialize
est utile si les objets sont imbriqués, mais pas indéfiniment.ReferenceLoopHandling.Ignore
ne sera pas sérialiser un objet si c'est un enfant de l'objet lui-même. Exemple:
JsonConvert.SerializeObject(YourPOCOHere, Formatting.Indented,
new JsonSerializerSettings {
ReferenceLoopHandling = ReferenceLoopHandling.Serialize
});
Si vous avez de sérialiser un objet qui est imbriqué indéfinie, vous pouvez utiliser PreserveObjectReferences pour éviter une StackOverflowException.
Exemple:
JsonConvert.SerializeObject(YourPOCOHere, Formatting.Indented,
new JsonSerializerSettings {
PreserveReferencesHandling = PreserveReferencesHandling.Objects
});
Choisissez ce qui fait sens pour l'objet à sérialiser.
Référence http://james.newtonking.com/json/help/
La solution est d’ignorer les références de la boucle et de ne pas sérialiser eux. Ce comportement est spécifié dans `` .
Unique `` avec une surcharge :
Le Paramètre global avec le code de `` dans Global.asax.cs :
Référence : https://github.com/JamesNK/Newtonsoft.Json/issues/78
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.