Rumah > pembangunan bahagian belakang > C++ > Mengapa JSON.Net Melemparkan StackOverflowException Apabila Menggunakan Anotasi JsonConvert, dan Bagaimana Ia Boleh Dibetulkan?

Mengapa JSON.Net Melemparkan StackOverflowException Apabila Menggunakan Anotasi JsonConvert, dan Bagaimana Ia Boleh Dibetulkan?

Patricia Arquette
Lepaskan: 2025-01-20 15:41:09
asal
227 orang telah melayarinya

Why Does JSON.Net Throw a StackOverflowException When Using the JsonConvert Annotation, and How Can It Be Fixed?

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 WriteJsonnya 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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan