Éviter StackOverflowException dans JSON.Net avec l'attribut [JsonConvert]
L'utilisation de l'attribut [JsonConvert] pour l'aplatissement des classes dans JSON.Net peut parfois conduire à un StackOverflowException
. Cela se produit généralement lorsque le processus de sérialisation rencontre des références récursives ou cycliques. Cependant, utiliser directement SerializeObject
sans l'attribut fonctionne correctement.
Le problème et la solution :
Le problème provient d'une mauvaise manipulation au sein de la WriteJson
méthode d'un JsonConverter
personnalisé. Une méthode WriteJson
robuste doit prendre en compte plusieurs complexités de sérialisation :
Voici une méthode WriteJson
améliorée qui répond à ces préoccupations :
<code class="language-csharp">public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } var contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(value.GetType()); writer.WriteStartObject(); foreach (var property in contract.Properties) { if (property.Ignored) continue; if (!ShouldSerialize(property, value)) continue; var propertyName = property.PropertyName; var propertyValue = property.ValueProvider.GetValue(value); writer.WritePropertyName(propertyName); if (property.Converter != null && property.Converter.CanWrite) { property.Converter.WriteJson(writer, propertyValue, serializer); } else { serializer.Serialize(writer, propertyValue); } } writer.WriteEndObject(); } private static bool ShouldSerialize(JsonProperty property, object instance) { return property.ShouldSerialize == null || property.ShouldSerialize(instance); }</code>
Cette implémentation WriteJson
raffinée fournit une approche plus complète et plus fiable de l'aplatissement des classes à l'aide d'une sérialisation personnalisée avec l'attribut [JsonConvert], empêchant ainsi efficacement les StackOverflowException
erreurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!