Migrasi ke System.Text.Json (JSON)

System.Text.Json Pustaka default untuk menekankan perilaku harfiah dan deterministik dan menghindari tebakan atau interpretasi atas nama pemanggil. Pustaka sengaja dirancang dengan cara ini untuk keamanan dan performa. Meskipun System.Text.Json sangat dapat dikonfigurasi dan fiturnya dapat digunakan untuk meminimalkan perubahan yang diperlukan pada tipe serial, penting untuk mempertimbangkan trade-off antara menangani tipe yang ada dengan perubahan sesedikit mungkin dengan merombak kembali tipe untuk mendukung serialisasi yang idiomatik dan aman.

Saat bermigrasi dari BinaryFormatter ke System.Text.Json, sangat penting untuk mencatat perilaku dan opsi berikut:

  • Secara default, bidang tidak diserialisasikan atau dideserialisasi dengan System.Text.Json, tetapi dapat dianotasi untuk serialisasi. Atau, JsonSerializerOptions.IncludeFields dapat dengan hati-hati diatur ke untuk true menyertakan semua bidang publik untuk jenis yang diserialisasikan.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • Secara default, System.Text.Jsonmengabaikan bidang dan properti privat. Anda dapat mengaktifkan penggunaan aksesor non-publik pada properti dengan menggunakan [JsonInclude] atribut . Termasuk bidang privat memerlukan beberapa pekerjaan ekstra yang tidak sepele.

  • System.Text.Json tidak dapat mendeserialisasi bidang atau properti baca-saja, tetapi [JsonConstructor] atribut dapat digunakan untuk menunjukkan bahwa konstruktor yang ditentukan harus digunakan untuk membuat instans jenis pada deserialisasi. Konstruktor dapat mengatur bidang dan properti baca-saja.

  • Untuk memodifikasi perilaku serialisasi default untuk jenis tertentu, Anda dapat menulis pengonversi kustom.

  • Ini mendukung serialisasi dan deserialisasi banyak koleksi, tetapi ada batasan. Lihat dokumentasi tentang jenis yang didukung untuk detail tentang jenis dan koleksi yang didukung dalam serialisasi dan deserialisasi.

  • Di bawah kondisi tertentu, ini mendukung serialisasi dan deserialisasi koleksi generik kustom.

  • Jenis lain tanpa dukungan bawaan adalah: DataSet, , DataTable, DBNullTimeZoneInfo, , Type. ValueTuple Namun, Anda dapat menulis pengonversi kustom untuk mendukung jenis ini.

  • Ini mendukung serialisasi dan deserialisasi hierarki tipe polimorfik di mana tipe tersebut telah secara eksplisit dipilih melalui atribut [JsonDerivedType] atau pengonversi kustom. Hierarki pewarisan terbuka tidak didukung, dan round-tripping dengan polimorfisme memerlukan pengidentifikasi diskriminator jenis untuk semua jenis turunan yang diketahui.

  • Atribut [JsonIgnore] pada properti menyebabkan properti dihilangkan dari JSON selama serialisasi.

  • Untuk mempertahankan referensi dan menangani referensi melingkar pada System.Text.Json, atur JsonSerializerOptions.ReferenceHandler ke ReferenceHandler.Preserve.

  • Serialization dapat disesuaikan secara luas dengan kontrak kustom, membuka blokir banyak skenario sambil meminimalkan perubahan pada jenis serial.