Bagikan melalui


Refleksi versus pembuatan sumber dalam System.Text.Json

Artikel ini menjelaskan perbedaan antara refleksi dan pembuatan sumber karena berkaitan dengan System.Text.Json serialisasi. Ini juga memberikan panduan tentang cara memilih pendekatan terbaik untuk skenario Anda.

Koleksi metadata

Untuk melakukan serialisasi atau deserialisasi jenis, JsonSerializer membutuhkan informasi tentang cara mengakses anggota jenis itu. JsonSerializer membutuhkan informasi berikut:

  • Cara mengakses getter properti dan bidang untuk serialisasi.
  • Cara mengakses konstruktor, setter properti, dan bidang untuk deserialisasi.
  • Informasi tentang atribut mana yang telah digunakan untuk menyesuaikan serialisasi atau deserialisasi.
  • Konfigurasi run-time dari JsonSerializerOptions.

Informasi tersebut disebut sebagai metadata.

Refleksi

Secara default, JsonSerializer mengumpulkan metadata pada durasi dengan menggunakan pantulan. Setiap kali JsonSerializer harus menserialisasikan atau mendeserialisasi jenis untuk pertama kalinya, maka akan mengumpulkan dan menyimpan metadata ini. Proses pengumpulan metadata membutuhkan waktu dan menggunakan memori.

Pembuatan sumber

Sebagai alternatif, System.Text.Json dapat menggunakan fitur pembuatan sumber C# untuk meningkatkan performa, mengurangi penggunaan memori privat, dan memfasilitasi pemangkasan rakitan, yang mengurangi ukuran aplikasi. Selain itu, API refleksi tertentu tidak dapat digunakan dalam aplikasi AOT Asli, jadi Anda harus menggunakan pembuatan sumber untuk aplikasi tersebut.

Pembuatan sumber dapat digunakan dalam dua mode:

  • Mode berbasis metadata

    Selama kompilasi, System.Text.Json mengumpulkan informasi yang diperlukan untuk serialisasi dan menghasilkan file kode sumber yang mengisi metadata kontrak JSON untuk jenis yang diminta.

  • Mode pengoptimalan serialisasi (jalur cepat)

    JsonSerializer fitur yang menyesuaikan output serialisasi, seperti kebijakan penamaan dan pelestarian referensi, membawa overhead performa. Dalam mode pengoptimalan serialisasi, System.Text.Json menghasilkan kode serialisasi yang dioptimalkan yang menggunakan Utf8JsonWriter secara langsung. Kode jalur yang dioptimalkan atau cepat ini meningkatkan throughput serialisasi.

    Deserialisasi jalur cepat saat ini tidak tersedia. Untuk informasi selengkapnya, lihat masalah dotnet/runtime 55043.

Pembuatan sumber untuk System.Text.Json memerlukan C# 9.0 atau versi yang lebih baru.

Perbandingan fitur

Pilih mode refleksi atau pembuatan sumber berdasarkan manfaat berikut yang ditawarkan masing-masing:

Keuntungan Refleksi Pembuatan sumber
(Mode berbasis metadata)
Pembuatan sumber
(Mode pengoptimalan serialisasi)
Lebih mudah dikodekan. ✔️
Lebih mudah untuk debug. ✔️ ✔️
Mendukung anggota non-publik. ✔️ ✔️* ✔️*
Mendukung semua kustomisasi serialisasi yang tersedia. ✔️
Mengurangi waktu mulai. ✔️ ✔️
Mengurangi penggunaan memori privat. ✔️ ✔️
Menghilangkan refleksi run-time. ✔️ ✔️
Memfasilitasi pengurangan ukuran aplikasi trim-safe. ✔️ ✔️
Meningkatkan throughput serialisasi. ✔️

* Generator sumber mendukung beberapa anggota non-publik, misalnya, jenis internal dalam rakitan yang sama. † Kontrak yang dihasilkan sumber dapat dimodifikasi menggunakan API penyesuaian kontrak.

Keuntungan Refleksi Pembuatan sumber
(Mode berbasis metadata)
Pembuatan sumber
(Mode pengoptimalan serialisasi)
Lebih mudah dikodekan. ✔️
Lebih mudah untuk debug. ✔️
Mendukung aksesor non-publik. ✔️
Mendukung properti yang diperlukan. ✔️
Mendukung properti khusus-init. ✔️
Mengurangi waktu mulai. ✔️ ✔️
Mengurangi penggunaan memori privat. ✔️ ✔️
Menghilangkan refleksi run-time. ✔️ ✔️
Memfasilitasi pengurangan ukuran aplikasi trim-safe. ✔️ ✔️
Meningkatkan throughput serialisasi. ✔️