Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengekalkan Gelagat Pensirilan System.Text.Json Lalai Apabila Melaksanakan JsonConverter Tersuai?

Bagaimanakah Saya Boleh Mengekalkan Gelagat Pensirilan System.Text.Json Lalai Apabila Melaksanakan JsonConverter Tersuai?

Linda Hamilton
Linda Hamiltonasal
2025-01-10 07:24:42840semak imbas

How Can I Preserve Default System.Text.Json Serialization Behavior When Implementing a Custom JsonConverter?

Sesuaikan siri System.Text.Json sambil mengekalkan tingkah laku lalai

Soalan:

Apabila melaksanakan System.Text.Json.JsonConverter tersuai untuk naik taraf model data, bagaimanakah saya boleh mengekalkan tingkah laku bersiri lalai dalam kaedah Write() tanpa menjejaskan pilihan bersiri lain?

Jawapan:

Untuk mengekalkan kelakuan bersiri lalai dalam kaedah Write() bagi System.Text.Json.JsonConverter tersuai, anda boleh menggunakan strategi berikut:

Pilihan 1: Gunakan [JsonConverter] pada atribut

  • Gunakan atribut [JsonConverter] pada sifat tertentu.
  • Memanggil JsonSerializer.Serialize() tanpa memberikan sebarang pilihan tersuai akan menjana siri lalai.

Pilihan 2: Ubah suai koleksi penukar

  • Di dalam kaedah Write(), buat salinan pilihan yang diluluskan dan alih keluar penukar tersuai daripada koleksi Penukar.
  • Lepaskan pilihan yang diubah suai ke dalam panggilan JsonSerializer bersarang.

Pilihan 3: Laksanakan DefaultConverterFactory

  • Tentukan kilang penukar tersuai (cth., DefaultConverterFactory) yang membalut penukar lalai.
  • Kaedah CanConvert() kilang menentukan sama ada penukar itu boleh digunakan.
  • Kaedah CreateConverter() kilang mencipta penukar menggunakan pilihan yang diubah suai (tidak termasuk penukar tersuai).

Had:

  • Pilihan 3 tidak berfungsi dengan jenis nilai tersuai atau POCO yang mempunyai atribut [JsonConverter] pada jenisnya sendiri.
  • Jenis rekursif boleh menyebabkan masalah kerana pilihan yang diubah suai tidak digunakan secara konsisten.

Contoh:

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
    {
        // 自定义读取实现
    }
}

public abstract class DefaultConverterFactory<T> : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert) => typeof(T) == typeToConvert;

    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        return new DefaultConverter(options, this);
    }
}

public sealed class DefaultConverter : JsonConverter<Person>
{
    public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions modifiedOptions)
    {
        // 调用默认的 Write 实现
        JsonSerializer.Serialize(writer, value, modifiedOptions);
    }
}</code>

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekalkan Gelagat Pensirilan System.Text.Json Lalai Apabila Melaksanakan JsonConverter Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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