Rumah > pembangunan bahagian belakang > C++ > Mengapa Atribut JsonConvert Saya Menyebabkan StackOverflowException Apabila Mensiri Objek Kompleks?

Mengapa Atribut JsonConvert Saya Menyebabkan StackOverflowException Apabila Mensiri Objek Kompleks?

DDD
Lepaskan: 2025-01-20 15:40:13
asal
462 orang telah melayarinya

Why Does My JsonConvert Attribute Cause a StackOverflowException When Serializing Complex Objects?

Menyelesaikan masalah StackOverflowException dalam JSON.Net dengan Atribut [JsonConvert]

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:

    Kaedah
  • ShouldSerialize*(): Kaedah tersuai yang menentukan pesirilan harta boleh membawa kepada pengulangan yang tidak diingini.
  • Nilai nol: Pengendalian nilai nol yang tidak betul boleh menyebabkan masalah.
  • Jenis nilai (struktur): Jenis data ini mungkin tidak dikendalikan dengan betul dalam proses rekursif.
  • Atribut penukar JSON: Penukar sedia ada pada sifat mungkin mengganggu logik rekursif.

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan