Mengatasi StackOverflowException dalam Atribut [JsonConvert()] JSON.Net
Menggunakan atribut [JsonConvert()] dalam JSON.Net untuk meratakan siri kelas boleh membawa kepada StackOverflowException
. Ini berlaku disebabkan pengulangan tak terhingga semasa proses penyirian JSON.
Untuk memintas perkara ini, JsonConverter
tersuai dengan kaedah WriteJson
tersuai diperlukan. Kaedah ini mesti memastikan penamatan proses bersiri yang betul. Walau bagaimanapun, mencipta kaedah ini boleh menjadi rumit, menuntut pengendalian berhati-hati bagi jenis boleh batal, jenis nilai dan atribut penukar JSON.
Penyelesaian yang teguh melibatkan pengesahan siri pada setiap hartanah untuk mengelakkan berulang kitaran. Kod berikut menunjukkan pendekatan ini:
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); }
Kod ini secara berkesan menghalang pengecualian dengan menyemak nilai nol, melangkau sifat yang diabaikan dan melaksanakan ShouldSerialize
logik dalam penukar tersuai, dengan itu memastikan pensirian JSON yang betul.
Atas ialah kandungan terperinci Bagaimana untuk Mencegah StackOverflowException Apabila Menggunakan Atribut JsonConvert dalam JSON.Net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!