· kaynak dev.to (home feed)
.NET 11, yerleşik Zstandard sıkıştırma akışları ve HttpClient zstd desteği ekliyor
.NET 11 RC 2, paylaşılan framework içine ZstandardStream, span tabanlı codec'ler, sözlük eğitimi ve HttpClient zstd desteği ekliyor; böylece üçüncü taraf zstd NuGet paketlerine gerek kalmıyor.

.NET 11, Zstandard (zstd) sıkıştırmayı temel sınıf kütüphanesine taşıyor; böylece uygulamaların bu formatı okumak ya da yazmak için üçüncü taraf bir NuGet sarmalayıcısına ihtiyacı kalmıyor. dev.to'daki bir yazıya göre yeni API'ler System.IO.Compression içinde yer alıyor, paylaşılan framework ile birlikte paket referansı gerektirmeden geliyor ve mevcut GZipStream ile BrotliStream'in yanında konumlanıyor. Runtime şu anda üretim kullanımı için go-live lisansı taşıyan Release Candidate 2 aşamasında, ancak genel kullanılabilirlik henüz gelmiş değil.
Yeni API yüzeyi neleri kapsıyor
dev.to yazısı beş yeni sıkıştırma tipi listeliyor. ZstandardStream, GZipStream ile aynı şekilde davranan bir Stream; dolayısıyla mevcut kod çoğu zaman yalnızca sınıf adının değiştirilmesini gerektiriyor. ZstandardEncoder ve ZstandardDecoder, stream soyutlaması istemeyen çağıranlar için span'lar üzerinde çalışıyor. ZstandardDictionary, örnek veri yüklerinden sıkıştırma sözlüğü eğitiyor; ZstandardCompressionOptions ise kalite (-131072 ile 22 arasında, varsayılan 3), pencere boyutu, checksum ve uzun mesafeli eşleştirme ayarlarını açığa çıkarıyor. Ağ tarafında DecompressionMethods.Zstandard otomatik yanıt açmayı etkinleştirirken, ZstandardCompressedContent giden istek gövdelerini sıkıştırıyor ve Content-Encoding: zstd başlığını ayarlıyor.
Sıkıştırma ve hız rakamları
Yazar, .NET 11 RC 1 SDK ile toplam 188.010 byte tutan 2.000 satır sahte JSON içeren sentetik bir log dosyasını CompressionLevel.Optimal düzeyinde 200 kez sıkıştırdı. GZip 218 ms'de 13.499 byte, Brotli 299 ms'de 11.936 byte, Zstandard ise 150 ms'de 11.891 byte üretti; böylece üç yerleşik sıkıştırıcı içinde hem en küçük hem de en hızlı olan oldu. Yazar, veri yükünün oldukça tekrarlı olduğunu ve testin tek bir makinede koştuğunu vurgulayarak rakamların bir benchmark değil yalnızca fikir verdiğini belirtiyor; yazı, .NET ekibinin kendi Canterbury Corpus sonuçlarına Preview 1 kütüphane sürüm notlarında işaret ediyor. Kaliteyi 19'a yükseltip sonuna bir checksum eklemek aynı dosyayı 7.535 byte'a indirdi.
Sözlükler küçük veri yüklerini kurtarıyor
Tek tek küçük mesajlar neredeyse sıkışmaz, çünkü tekrar mesajların içinde değil aralarındadır. Yazar, 1.000 "order.created" olayı üzerinde 4.096 byte'lık bir ZstandardDictionary eğitti, ardından sözlüğün hiç görmediği 200 olayı sıkıştırdı. Ham mesajlar ortalama 152,2 byte; düz zstd yalnızca 134,7 byte; sözlükle ortalama 38,6 byte'a düştü. Yazıya göre bu fark, sıkıştırmayı olay kuyrukları ve benzeri küçük mesajlı iş yükleri için değmez olmaktan bariz bir kazanca çeviriyor.
HttpClient entegrasyonu
Tek bir ayar — AutomaticDecompression'a DecompressionMethods.Zstandard'yı eklemek — HttpClient'ın Accept-Encoding içinde gzip ve zstd duyurmasını ve yanıtları şeffaf biçimde açmasını sağlıyor. Yazarın yerel test sunucusu, 8.000 byte JSON isteğine 33 byte zstd ile yanıt verdi ve GetStringAsync yine de tam metni döndürdü. Öbür yönde, bir StringContent'i ZstandardCompressedContent ile sarmalamak, küçük bir JSON nesnesinin 300 kopyasını hat üzerinde 36 byte olarak test sunucusuna iletti; ancak yazı, bunu etkinleştirmeden önce sunucunun gerçekten zstd istek gövdelerini kabul ettiğini doğrulamayı öğütlüyor.
Dikkat edilmesi gereken keskin kenarlar
Yazı dört tuzak işaret ediyor. TryCompress'te sözlükten sonraki tamsayı parametre kalite değil windowLog2; 10'un altındaki değerler ArgumentOutOfRangeException fırlatıyor — güvenli değer ZstandardCompressionOptions.DefaultWindowLog2 (23). Sözlükle sıkıştırılmış veriyi eşleşen sözlük olmadan açmak sessizce başarısız oluyor: TryDecompress yalnızca false döndürüyor, bu yüzden sözlüklerin sürümlendirilmesi ve mesajlarla birlikte bir tanımlayıcının gönderilmesi gerekiyor. Varsayılan bir HttpClient hiç Accept-Encoding başlığı göndermiyor; dolayısıyla sunucu yine de sıkıştırırsa istemci JSON yerine ham zstd byte'ları alıyor. Son olarak, preview döneminden kalma örnek kodlar artık eskimiş durumda: WindowLog, RC'de WindowLog2, MinWindowLog2 ve MaxWindowLog2 olarak yeniden adlandırıldı; yani API dokümantasyonu eski blog parçacıklarından daha yetkili. Üst kaynak ayrıntıları için yazı, Microsoft Learn'deki "What's new in .NET 11 libraries" sayfasına ve dotnet/runtime #119575 ile #123531 issue'larına bağlantı veriyor.
Neden önemli
zstd, log hatlarında, veritabanlarında ve HTTP içerik görüşmelerinde ortak payda hâline geldi; ama .NET geliştiricileri daha önce bir üçüncü taraf sarmalayıcı seçmek, yerel binary'lerinin her hedef platform için mevcut olduğunu doğrulamak ve bakımının devam etmesini ummak zorundaydı — her güvenlik incelemesinde yeniden ortaya çıkan türden bir bağımlılık. zstd'yi birinci sınıf bir Stream hâline getirmek, gzip ve Brotli deneyimini yansıtıyor ve geçiş maliyetini sıfıra yakın tutuyor. Sözlük desteği sıkıştırmayı, daha önce kâr etmediği küçük mesaj senaryolarına genişletiyor; HttpClient kancaları ise .NET istemcilerini zstd konuşan sunuculara hazırlıyor. .NET 11 genel kullanılabilirliğe ulaştığında, tüm bir NuGet bağımlılığı kategorisi basitçe silinebilecek.
- #dotnet
- #zstandard
- #compression
- #net-11
- #http-client