İç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.
- Yeni System.Text.Json kaynak oluşturucuyu deneyin
- .NET 'te JSON serileştirme ve serisini kaldırma-genel bakış
- Kitaplığı kullanma
- JsonSerializerOptions örneklerinin örneğini oluşturma
- Büyük/küçük harf duyarlı eşlemeyi etkinleştirme
- Özellik adlarını ve değerlerini özelleştirme
- Özellikleri yoksayma
- Geçersiz JSON’a izin verme
- Taşma JSON 'ı veya JsonElement veya JsonNode kullanın
- Başvuruları koru ve döngüsel başvuruları işle
- Sabit türler ve genel olmayan erişimciler için seri durumdan çıkarma
- Polimorfik serileştirme
- Newtonsoft. JSON öğesinden öğesine geçirin System.Text.Json
- Karakter kodlamasını özelleştirme
- DOM, Utf8JsonReader ve Utf8JsonWriter kullanma
- JSON serileştirme için özel dönüştürücüler yazma
- DateTime ve DateTimeOffset desteği
- İçinde desteklenen koleksiyon türleri System.Text.Json
- System.Text.Json API başvurusu
- System.Text.Json. Serileştirme API başvurusu