Bagikan melalui


Mode pembuatan sumber dalam System.Text.Json

Pembuatan sumber dapat digunakan dalam dua mode: berbasis metadata dan pengoptimalan serialisasi. Artikel ini menjelaskan berbagai mode.

Untuk informasi tentang cara menggunakan mode pembuatan sumber, lihat Cara menggunakan pembuatan sumber di System.Text.Json.

Mode berbasis metadata

Anda dapat menggunakan pembuatan sumber untuk memindahkan proses pengumpulan metadata dari runtime ke waktu kompilasi. Selama kompilasi, metadata dikumpulkan dan file kode sumber dihasilkan. File kode sumber yang dihasilkan secara otomatis dikompilasi sebagai bagian integral dari aplikasi. Teknik ini menghilangkan pengumpulan metadata runtime, yang meningkatkan performa serialisasi dan deserialisasi.

Peningkatan performa yang disediakan oleh pembuatan sumber dapat menjadi substansial. Misalnya, hasil pengujian telah menunjukkan pengurangan waktu mulai hingga 40% atau lebih, pengurangan memori privat, peningkatan kecepatan throughput (dalam mode pengoptimalan serialisasi), dan pengurangan ukuran aplikasi.

Masalah umum

Hanya public properti dan bidang yang didukung secara default dalam mode serialisasi (pantulan atau pembuatan sumber). Namun, mode refleksi mendukung penggunaan private anggota, sementara mode pembuatan sumber tidak. Misalnya, jika Anda menerapkan atribut JsonInclude ke private properti atau properti yang memiliki private setter atau getter, itu akan diserialisasikan dalam mode refleksi. Mode pembuatan sumber hanya public mendukung atau internal anggota dan public atau internal aksesor public properti. Jika Anda mengatur [JsonInclude]private anggota atau aksesor dan memilih mode pembuatan sumber, NotSupportedException akan dilemparkan pada runtime.

Untuk informasi tentang masalah lain yang diketahui dengan pembuatan sumber, lihat masalah GitHub yang diberi label "generator sumber" di repositori dotnet/runtime.

Mode pengoptimalan serialisasi (jalur cepat)

JsonSerializer memiliki banyak fitur yang menyesuaikan output serialisasi, seperti kebijakan penamaan dan mempertahankan referensi. Dukungan untuk semua fitur tersebut menyebabkan beberapa overhead performa. Pembuatan sumber dapat meningkatkan performa serialisasi dengan menghasilkan kode yang dioptimalkan yang menggunakan Utf8JsonWriter secara langsung.

Mode pengoptimalan serialisasi memancarkan metode serialisasi jalur cepat tetapi bukan metadata serialisasi. Serialisasi jalur cepat dibatasi dalam apa yang dapat dilakukannya; ini tidak mendukung serialisasi asinkron atau mode deserialisasi apa pun.

Selain itu, kode yang dioptimalkan tidak mendukung semua fitur serialisasi yang JsonSerializer mendukung. Serializer mendeteksi apakah kode yang dioptimalkan dapat digunakan dan kembali ke kode serialisasi default jika opsi yang tidak didukung ditentukan. Misalnya, JsonNumberHandling.AllowReadingFromString tidak berlaku untuk menulis, jadi menentukan opsi ini tidak menyebabkan fallback ke kode default.

Tabel berikut ini memperlihatkan opsi mana yang JsonSerializerOptions didukung oleh serialisasi jalur cepat:

Opsi serialisasi Didukung untuk jalur cepat
AllowTrailingCommas ✔️
Converters
DefaultBufferSize ✔️
DefaultIgnoreCondition ✔️
DictionaryKeyPolicy
Encoder
IgnoreNullValues
IgnoreReadOnlyFields ✔️
IgnoreReadOnlyProperties ✔️
IncludeFields ✔️
MaxDepth ✔️
NumberHandling
PropertyNamingPolicy ✔️
ReferenceHandler
TypeInfoResolver ✔️
WriteIndented ✔️

(Opsi berikut tidak didukung karena hanya berlaku untuk deserialisasi: PropertyNameCaseInsensitive, , ReadCommentHandlingdan UnknownTypeHandling.)

Tabel berikut menunjukkan atribut mana yang didukung oleh serialisasi jalur cepat:

Atribut Didukung untuk jalur cepat
JsonConstructorAttribute
JsonConverterAttribute
JsonDerivedTypeAttribute ✔️
JsonExtensionDataAttribute
JsonIgnoreAttribute ✔️
JsonIncludeAttribute ✔️
JsonNumberHandlingAttribute
JsonPolymorphicAttribute ✔️
JsonPropertyNameAttribute ✔️
JsonPropertyOrderAttribute ✔️
JsonRequiredAttribute ✔️

Jika opsi atau atribut yang tidak didukung ditentukan untuk jenis, serializer kembali ke mode metadata, dengan asumsi bahwa generator sumber telah dikonfigurasi untuk menghasilkan metadata. Dalam hal ini, kode yang dioptimalkan tidak digunakan saat menserialisasikan jenis tersebut, tetapi mungkin digunakan untuk jenis lain. Oleh karena itu, penting untuk melakukan pengujian performa dengan opsi dan beban kerja Anda untuk menentukan berapa banyak manfaat yang benar-benar dapat Anda dapatkan dari mode pengoptimalan serialisasi. Selain itu, kemampuan untuk kembali ke JsonSerializer kode memerlukan mode metadata. Jika Anda hanya memilih mode pengoptimalan serialisasi, serialisasi mungkin gagal untuk jenis atau opsi yang perlu kembali ke JsonSerializer kode.

Lihat juga