WriteLine ile JSON Lines yazmayı bırakın: .NET 11 bunu sizin için yapıyor
.NET 11, System.Text.Json'a JSON Lines (JSONL) yazan yeni overload'lar ekliyor: SerializeAsyncEnumerable artık bir IAsyncEnumerable<T> içeriğini Stream veya PipeWriter'a tek çağrıda aktarabiliyor. topLevelValues: true verildiğinde her kayıt kompakt biçimde ve sonunda LF ile yazılıyor, böylece elle kurulan WriteLine döngülerinin ürettiği bozuk dosyalar ortadan kalkıyor. Özellik .NET 11 RC 2'de mevcut, henüz GA değil.
Kilit noktalar
- SerializeAsyncEnumerable, IAsyncEnumerable<T> alıp Stream veya PipeWriter'a yazan dört yeni overload ile geliyor.
- topLevelValues: true JSONL üretir; varsayılan false değeri eskisi gibi tek bir JSON dizisi yazar.
- JSONL modunda WriteIndented ve NewLine yok sayılır, satır sonu her zaman LF olur; son kayıttan sonra da LF eklenir.
- PipeWriter overload'u ASP.NET Core'da Response.BodyWriter ile doğrudan kullanılıp kayıtları üretildikçe akıtıyor.
- Native AOT ve file-based app'lerde RequiresDynamicCode nedeniyle source-generated JsonTypeInfo alan overload tercih edilmeli.
- Özellik yalnızca .NET 11'de var; .NET 10'da DeserializeAsyncEnumerable tarafı vardı, SerializeAsyncEnumerable hiç yoktu.
.NET 11, System.Text.Json'ın uzun süredir okuma tarafında sunduğu JSON Lines desteğine yazma tarafını da ekliyor: IAsyncEnumerable<T> alıp bir Stream ya da PipeWriter'a yazan dört yeni JsonSerializer.SerializeAsyncEnumerable overload'u geldi. topLevelValues: true verildiğinde her değer kompakt biçimde ve sonuna LF eklenerek yazılıyor; WriteIndented ile NewLine bilinçli olarak yok sayılıyor, varsayılan davranış ise tek bir dizi üretmeye devam ediyor. Yazarın denemesinde iki kayıt 78 byte ve iki LF tuttu; elle yazılan WriteLineAsync döngüsü aynı veri için 114 byte ve on satır üretti.
PipeWriter overload'u ASP.NET Core için biçilmiş kaftan: Response.BodyWriter zaten bir PipeWriter, böylece kayıtlar dizi kapanmadan istemciye ulaşıyor. Dikkat edilmesi gerekenler: yalnızca .NET 11'de var (RC 2, go-live lisansı, henüz GA değil), sadece IAsyncEnumerable<T> kabul ediyor ve Native AOT ya da file-based app kullanıyorsanız source-generated JsonTypeInfo overload'una geçmeniz gerekiyor.
Gerçek dünyada kullanımı
- Milyonlarca satırı tek seferde belleğe almadan JSONL olarak dışa aktaran bir veri export endpoint'i.
- Büyük veri kümelerini sayfa sayfa okuyup sonuçları satır satır istemciye akıtan bir ASP.NET Core minimal API.
- Üretimde yazılan JSONL log dosyalarının sonradan DeserializeAsyncEnumerable ile tekrar okunup işlendiği arka plan worker'ları.
- Yeni kayıtların dosya sonuna eklenerek biriktiği, tüm dosyanın yeniden yazılmadığı denetim kayıtları.
Neden önemli
JSONL üreten kod artık elle kurulan serileştirme döngülerine ve format seçeneklerinin sessizce bozduğu dosyalara bağlı değil; tek çağrı hem doğru formatı hem de gerçek streaming davranışını garanti ediyor.
Benzer haberler
- .NET'te Tüm Caching Türleri: Hangisi Ne Zaman Kullanılır? (Derin İnceleme, 2. Bölüm)DEV Community: #aspnetcore2 gün önce
- Middleware'de istek gövdesini okumak ikinci okuyucuyu boş bırakırDEV Community: #aspnetcore27 Eki
- Cache-Control header'ı output cache değildir: handler sayacıyla kanıtDEV Community: #aspnetcore22 Eki