Le problème :
La sérialisation d'objets complexes en JSON aplati à l'aide de l'attribut [JsonConvert] dans JSON.Net peut déclencher un StackOverflowException
.
Cause fondamentale :
Le convertisseur personnalisé FJson
fourni utilise une méthode récursive (WriteJson
) pour écrire le graphique d'objet dans l'écrivain JSON. Cette approche récursive ne dispose pas de garanties suffisantes pour différents scénarios, ce qui entraîne des boucles infinies potentielles et des erreurs de débordement de pile. Ces scénarios incluent :
ShouldSerialize*()
méthodes : les méthodes personnalisées déterminant la sérialisation des propriétés peuvent entraîner une récursion involontaire.Résolution :
La clé pour résoudre ce StackOverflowException
réside dans l'amélioration de la méthode WriteJson
du convertisseur FJson
pour répondre à ces cas extrêmes. Une méthode WriteJson
révisée est présentée ci-dessous :
<code class="language-csharp">public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (ReferenceEquals(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 version améliorée gère explicitement les valeurs nulles et intègre une méthode d'assistance ShouldSerialize
pour gérer efficacement les méthodes ShouldSerialize*()
personnalisées, empêchant ainsi la récursivité infinie qui mène au StackOverflowException
. Il délègue également correctement la sérialisation aux convertisseurs existants, le cas échéant. Cette approche révisée devrait sérialiser de manière fiable les objets complexes sans rencontrer d'erreur de débordement de pile lorsqu'elle est utilisée avec l'attribut [JsonConvert].
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!