Menyelesaikan StackOverflowException JSON.Net Apabila Menggunakan JsonConvert
Atribut
Mensiri kelas yang diratakan menggunakan atribut [JsonConvert]
boleh membawa kepada StackOverflowException
dalam JSON.Net. Masalah ini, tidak seperti apabila menggunakan SerializeObject
secara langsung, berpunca daripada panggilan rekursif.
Penyelesaian: Mengelakkan Pensirian Rekursif
Isu timbul daripada interaksi penukar tersuai dan JsonConvert
. Apabila penukar tersuai (cth., [JsonConverter(typeof(FJson))]
) digunakan, kaedah WriteJson
nya dipanggil. Jika kaedah ini, seterusnya, memanggil JsonConvert.SerializeObject
(sama ada secara langsung atau tidak langsung), gelung rekursif dibuat, mengakibatkan limpahan tindanan.
Pengubahsuaian Kod untuk WriteJson
Untuk mengelakkan pengulangan ini, kaedah WriteJson
perlu ditulis semula untuk mensiri setiap sifat secara individu, mengelakkan panggilan rekursif ke JsonConvert.SerializeObject
. Berikut ialah pelaksanaan yang disemak semula:
<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; writer.WritePropertyName(propertyName); var propertyValue = property.ValueProvider.GetValue(value); 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>
Penjelasan:
Kaedah WriteJson
yang disemak ini berulang melalui setiap sifat objek. Ia menyemak sifat diabaikan dan kaedah ShouldSerialize
sebelum mensiri setiap nilai harta secara terus menggunakan penyeri, dengan itu menghapuskan panggilan rekursif dan menyelesaikan StackOverflowException
.
Kesimpulan:
Dengan mensiri secara langsung sifat individu dalam kaedah WriteJson
penukar tersuai, kami mematahkan kitaran rekursif, menghalang StackOverflowException
dan memastikan siri yang boleh dipercayai bagi kelas yang diratakan. Pendekatan ini menyediakan penyelesaian yang teguh untuk mengurus struktur objek kompleks dalam JSON.Net.
Atas ialah kandungan terperinci Mengapa JSON.Net Melemparkan StackOverflowException Apabila Menggunakan Anotasi JsonConvert, dan Bagaimana Ia Boleh Dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!