Masalahnya:
Mensiri objek rumit menjadi JSON yang diratakan menggunakan atribut [JsonConvert] dalam JSON.Net boleh mencetuskan StackOverflowException
.
Punca Punca:
Penukar tersuai FJson
yang disediakan menggunakan kaedah rekursif (WriteJson
) untuk menulis graf objek kepada penulis JSON. Pendekatan rekursif ini tidak mempunyai perlindungan yang mencukupi untuk pelbagai senario, mengakibatkan kemungkinan gelung tak terhingga dan ralat limpahan tindanan. Senario ini termasuk:
ShouldSerialize*()
: Kaedah tersuai yang menentukan pesirilan harta boleh membawa kepada pengulangan yang tidak diingini.Penyelesaian:
Kunci untuk menyelesaikan StackOverflowException
ini terletak pada meningkatkan kaedah WriteJson
penukar FJson
untuk menangani kes kelebihan ini. Kaedah WriteJson
yang disemak semula ditunjukkan di bawah:
<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>
Versi yang dipertingkatkan ini secara eksplisit mengendalikan nilai nol dan menggabungkan ShouldSerialize
kaedah pembantu untuk mengurus kaedah ShouldSerialize*()
tersuai dengan berkesan, dengan itu menghalang pengulangan tak terhingga yang membawa kepada StackOverflowException
. Ia juga mewakilkan siri dengan betul kepada penukar sedia ada jika sesuai. Pendekatan yang disemak ini harus mensiri objek kompleks dengan pasti tanpa menghadapi ralat limpahan tindanan apabila digunakan dengan atribut [JsonConvert].
Atas ialah kandungan terperinci Mengapa Atribut JsonConvert Saya Menyebabkan StackOverflowException Apabila Mensiri Objek Kompleks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!