Das Problem:
Das Serialisieren komplexer Objekte in abgeflachtes JSON mithilfe des Attributs [JsonConvert] in JSON.Net kann ein StackOverflowException
auslösen.
Grundursache:
Der bereitgestellte FJson
benutzerdefinierte Konverter verwendet eine rekursive Methode (WriteJson
), um das Objektdiagramm in den JSON-Writer zu schreiben. Diesem rekursiven Ansatz fehlen ausreichende Schutzmaßnahmen für verschiedene Szenarien, was zu potenziellen Endlosschleifen und Stapelüberlauffehlern führen kann. Zu diesen Szenarien gehören:
ShouldSerialize*()
Methoden: Benutzerdefinierte Methoden zur Bestimmung der Eigenschaftsserialisierung können zu unbeabsichtigter Rekursion führen.Auflösung:
Der Schlüssel zur Lösung dieses StackOverflowException
liegt in der Verbesserung der WriteJson
-Methode des FJson
-Konverters, um diese Randfälle zu berücksichtigen. Eine überarbeitete WriteJson
Methode ist unten dargestellt:
<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>
Diese verbesserte Version behandelt explizit Nullwerte und enthält eine ShouldSerialize
-Hilfsmethode, um benutzerdefinierte ShouldSerialize*()
-Methoden effektiv zu verwalten und so die unendliche Rekursion zu verhindern, die zum StackOverflowException
führt. Außerdem wird die Serialisierung gegebenenfalls korrekt an vorhandene Konverter delegiert. Dieser überarbeitete Ansatz sollte komplexe Objekte zuverlässig serialisieren, ohne dass der Stapelüberlauffehler auftritt, wenn er mit dem Attribut [JsonConvert] verwendet wird.
Das obige ist der detaillierte Inhalt vonWarum verursacht mein JsonConvert-Attribut beim Serialisieren komplexer Objekte eine StackOverflowException?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!