İçinde yansıma veya kaynak oluşturmayı seçme System.Text.Json

Önemli

Bazı bilgiler, yayımlanmadan önce önemli ölçüde değiştirilebilen ön sürüm ürünüyle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Varsayılan olarak, System.Text.Json serileştirme ve seri durumundan çıkarma için nesnelerin özelliklerine erişmesi gereken meta verileri toplamak üzere çalışma zamanı yansımasını kullanır. Alternatif olarak, System.Text.Json 6,0, performansı artırmak, özel bellek kullanımını azaltmak ve uygulama boyutunu azaltan derleme kırpmasınıkolaylaştırmak için C# kaynak oluşturma özelliğini kullanabilir.

System.Text.JsonÖnceki çerçeveleri hedefleyen projelerde 6,0 sürümünü kullanabilirsiniz. Daha fazla bilgi için bkz. kitaplığı alma.

Bu makalede seçenekler açıklanmakta ve senaryonuz için en iyi yaklaşımı seçme hakkında rehberlik sunulmaktadır.

System.Text.Jsonsürüm 6,0 ve üzeri, performansı artırmak, özel bellek kullanımını azaltmak ve derleme kırpma doğruluğunu artırmak Için C# kaynak oluşturma özelliğini kullanabilir. System.Text.JsonÖnceki çerçeveleri hedefleyen projelerde 6,0 sürümünü kullanabilirsiniz. Daha fazla bilgi için bkz.

Genel Bakış

Her birinin sunduğu aşağıdaki avantajları temel alarak yansıma veya kaynak oluşturma modlarını seçin:

Avantaj Yansıma Kaynak oluşturma:
Meta veri koleksiyonu
Kaynak oluşturma:
Serileştirme iyileştirmesi
Kodun ve hata ayıklamanın basittir. ✔️
Genel olmayan erişimcileri destekler. ✔️
Yalnızca init özelliklerini destekler. ✔️
Tüm kullanılabilir serileştirme özelleştirmelerini destekler. ✔️
Başlangıç süresini azaltır. ✔️
Özel bellek kullanımını azaltır. ✔️ ✔️
Çalışma zamanı yansımasını ortadan kaldırır. ✔️ ✔️
Kırpma güvenli uygulama boyutu azaltmaya olanak sağlar. ✔️ ✔️
Serileştirme aktarım hızını artırır. ✔️

Aşağıdaki bölümlerde bu seçenekler ve bunların göreli avantajları açıklanmaktadır.

System.Text.Json veriyi

Bir türü seri hale getirmek veya seri durumdan çıkarmak için, JsonSerializer türün üyelerine erişme hakkında bilgi gerekir. JsonSerializer Aşağıdaki bilgileri gerektirir:

  • Serileştirme için özellik ve alanlara erişme.
  • Seri durumdan çıkarma için bir oluşturucuya, özellik ayarlayıcılarına ve alanlara erişme.
  • Serileştirme veya seri durumdan çıkarmayı özelleştirmek için hangi özniteliklerin kullanıldığı hakkında bilgi.
  • İçindeki çalışma zamanı yapılandırması JsonSerializerOptions .

Bu bilgiler meta veriler olarak adlandırılır.

Varsayılan olarak, JsonSerializer yansımakullanarak çalışma zamanında meta verileri toplar. JsonSerializerBir türü ilk kez serileştirmek veya seri durumdan çıkarmak gerektiğinde, bu meta verileri toplar ve önbelleğe alır. Meta veri toplama işlemi zaman alır ve bellek kullanır.

Kaynak oluşturma-meta veri toplama modu

Meta veri toplama işlemini çalışma zamanından derleme zamanına taşımak için kaynak oluşturmayı kullanabilirsiniz. Derleme sırasında meta veriler toplanır ve kaynak kodu dosyaları oluşturulur. Oluşturulan kaynak kodu dosyaları otomatik olarak uygulamanın integral bir parçası olarak derlenir. Bu derleme zamanı meta veri koleksiyonu, serileştirme ve seri durumundan çıkarma performansını artıran çalışma zamanı meta veri toplamayı ortadan kaldırır.

Kaynak oluşturma tarafından sunulan performans geliştirmeleri önemli olabilir. Örneğin, test sonuçları %40 veya daha fazla başlangıç saati azaltma, özel bellek azaltma, verimlilik hızı artışı (serileştirme en iyi duruma getirme modu) ve uygulama boyutu azalmasıyla gösteriliyor.

Kaynak oluşturma-bilinen sorunlar

Yansıma modu, genel olmayan ortak özellik erişimcilerinin kullanımını destekler. Örneğin, bir ayarlayıcı veya alıcı içeren bir özelliğe [Jsonınclude] uygulayabilirsiniz private . Kaynak oluşturma modu, ortak özelliklerin yalnızca ortak veya iç erişimcilerini destekler. [JsonInclude]Kaynak oluşturma modundaki genel olmayan Erişimcilerde kullanılması, çalışma zamanında sonuçlanır NotSupportedException .

Yansıma modu aynı zamanda yalnızca init özelliklerine seri durumdan çıkarmayı destekler. Seri durumdan çıkarma için gereken meta veri modu gerekli başlatmayı statik olarak kaynak kodunda ifade ettiğinden kaynak oluşturma bunu desteklemez. Yansıma serileştirici, oluşturma sonrasında özellikleri ayarlamak için çalışma zamanı yansımasını kullanır.

Hem yansıma hem de kaynak oluşturma modlarında:

  • Yalnızca ortak özellikler ve genel alanlar desteklenir.
  • Seri durumdan çıkarma için yalnızca ortak oluşturucular kullanılabilir.

genel olmayan üyeler için destek ekleme isteği hakkında daha fazla bilgi için bkz. GitHub sorunu dotnet/runtime # 31511. Bu istek uygulansa bile, kaynak oluşturma modu hala Genel Üyeler desteğiyle sınırlı olacaktır.

kaynak oluşturmayla ilgili diğer bilinen sorunlar hakkında daha fazla bilgi için dotnet/runtime deposunda "kaynak-oluşturucu" etiketli GitHub sorunlara bakın.

Serileştirme iyileştirme modu

JsonSerializer , Camel, büyük/ küçük harf Özellik adları ve başvuruları korumagibi serileştirme çıkışını özelleştiren birçok özelliğe sahiptir. Tüm bu özellikler için destek bazı performans ek yüküne neden olur. Kaynak oluşturma, doğrudan kullanan iyileştirilmiş kod oluşturarak serileştirme performansını iyileştirebilir Utf8JsonWriter .

İyileştirilmiş kod, tarafından desteklenen serileştirme özelliklerinin tümünü desteklemez JsonSerializer . Seri hale getirici, en iyileştirilmiş kodun kullanılıp kullanılamayacağını algılar ve desteklenmeyen seçenekler belirtilmişse varsayılan serileştirme koduna geri döner. Örneğin, JsonNumberHandling.AllowReadingFromString yazmak için geçerli değildir, bu nedenle bu seçeneğin belirlenmesi varsayılan koda geri dönüş yapılmasına neden olmaz.

Aşağıdaki tabloda, ' de JsonSerializerOptions en iyileştirilmiş serileştirme kodu tarafından hangi seçeneklerin desteklendiği gösterilmektedir:

Seri hale getirme seçeneği İyileştirilmiş kod tarafından destekleniyor
Converters
DefaultIgnoreCondition ✔️
DictionaryKeyPolicy
Encoder
IgnoreNullValues
IgnoreReadOnlyFields ✔️
IgnoreReadOnlyProperties ✔️
IncludeFields ✔️
NumberHandling
PropertyNamingPolicy ✔️
ReferenceHandler
WriteIndented ✔️

Aşağıdaki tabloda, en iyileştirilmiş serileştirme kodu tarafından hangi özniteliklerin desteklendiği gösterilmektedir:

Öznitelik İyileştirilmiş kod tarafından destekleniyor
JsonConverterAttribute
JsonExtensionDataAttribute
JsonIgnoreAttribute ✔️
JsonIncludeAttribute ✔️
JsonNumberHandlingAttribute
JsonPropertyNameAttribute ✔️

Bir tür için desteklenmeyen bir seçenek veya öznitelik belirtilmişse, serileştirici varsayılan koda geri döner JsonSerializer . Bu durumda, en iyi duruma getirilmiş kod bu tür serileştirilirken kullanılmaz, ancak diğer türler için de kullanılabilir. Bu nedenle, serileştirme iyileştirme modundan gerçekten ne kadar avantaj alınacağını öğrenmek için seçenekleriniz ve iş yükleriniz ile performans testi yapmanız önemlidir. Ayrıca, koda geri dönebilme için JsonSerializer meta veri toplama modu gerekir. Yalnızca serileştirme iyileştirme modunu seçerseniz, koda geri dönmesi gereken türler veya seçenekler için serileştirme başarısız olabilir JsonSerializer .

Kaynak oluşturma modlarını kullanma

Belgelerinin çoğu, System.Text.Json yansıma modunu kullanan kodun nasıl yazılacağını gösterir. Kaynak oluşturma modlarını kullanma hakkında daha fazla bilgi için bkz. kaynak oluşturmayı System.Text.Json kullanma .

Ayrıca bkz.