Mengelakkan StackOverflowException dalam JSON.Net dengan [JsonConvert] Atribut
Menggunakan atribut [JsonConvert] untuk meratakan kelas dalam JSON.Net kadangkala boleh membawa kepada StackOverflowException
. Ini biasanya berlaku apabila proses bersiri menemui rujukan rekursif atau kitaran. Walau bagaimanapun, penggunaan terus SerializeObject
tanpa atribut berfungsi dengan betul.
Masalah dan Penyelesaian:
Isu ini berpunca daripada pengendalian yang tidak betul dalam kaedah WriteJson
tersuai JsonConverter
. Kaedah WriteJson
yang mantap mesti mengambil kira beberapa kerumitan siri:
Berikut ialah kaedah WriteJson
yang dipertingkatkan yang menangani kebimbangan ini:
<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>
Pelaksanaan WriteJson
yang diperhalusi ini menyediakan pendekatan yang lebih komprehensif dan boleh dipercayai untuk meratakan kelas menggunakan siri tersuai dengan atribut [JsonConvert], dengan berkesan mencegah ralat StackOverflowException
.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan StackOverflowException Apabila Menggunakan Atribut JsonConvert untuk Meratakan Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!