Neu in .NET 9.0 [25]: Einstellungen für die Komprimierung mit ZLib und Brotli
.NET 9.0 verbessert die Kompressionseinstellungen durch zwei neue Klassen für ZLib und Brotli, die flexibler als die bisherigen sind.
(Bild: Pincasso/Shutterstock.com)
- Dr. Holger Schwichtenberg
.NET beherrscht die Komprimierung mit ZLib und Brotli schon seit Jahren. Mit .NET 9.0 führt Microsoft nun zwei Klassen ZLibCompressionOptions und BrotliCompressionOptions ein, mit denen man spezifische Kompressionseinstellungen vornehmen kann.
Bei der Klasse ZLibCompressionOptions gibt es die Eigenschaften CompressionStrategy in Form einer Enumeration und CompressionLevel als Ganzzahl zwischen 0 und 9, wobei 0 keine Komprimierung bedeutet. Bei der Klasse BrotliCompressionOptions gibt es nur eine Eigenschaft Quality als Ganzzahl von 0 bis 11.
Videos by heise
Der folgende Code zeigt ein Einsatzbeispiel, das für alle zehn ZLib-Komprimierungslevel sowie für alle 12 Quality-Level bei der Brotli-Komprimierung die Größe eines komprimierten Textes mit 100.000 Zeichen ausgibt:
public class FCL9_Compression
{
string GetText(int length = 1)
{
string text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
// length * text
for (int i = 0; i < length; i++) text += text;
Console.WriteLine("Länge Originaltext: " + text.Length);
return text;
}
public void ZLib()
{
string text = GetText(3);
int level = 5; // 0-9
var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(text));
var compressedStream = new MemoryStream();
using var zipStream = new ZLibStream(compressedStream, new ZLibCompressionOptions() { CompressionLevel = level, CompressionStrategy = ZLibCompressionStrategy.Default });
uncompressedStream.CopyTo(zipStream);
zipStream.Flush();
Console.WriteLine($"Länge bei ZLib-Komprimierungslevel #{level}: " + compressedStream.Length);
zipStream.Dispose();
}
public void Brotli()
{
string text = GetText(3);
int quality = 5; // 0-11
var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(text));
var compressedStream = new MemoryStream();
using var brotliStream = new BrotliStream(compressedStream, new BrotliCompressionOptions() { Quality = quality });
uncompressedStream.CopyTo(brotliStream);
brotliStream.Flush();
Console.WriteLine($"Länge bei Brotli-Komprimierungslevel #{quality}: " + compressedStream.Length);
brotliStream.Dispose();
}
public void ZLibAndBrotliComparison()
{
CUI.Demo();
string text = GetText(3);
for (int i = 0; i <= 9; i++)
{
var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(text));
var compressedStream = new MemoryStream();
using var zipStream = new ZLibStream(compressedStream, new ZLibCompressionOptions() { CompressionLevel = i, CompressionStrategy = ZLibCompressionStrategy.Default });
uncompressedStream.CopyTo(zipStream);
zipStream.Flush();
Console.WriteLine($"Länge bei ZLib-Komprimierungslevel #{i}: " + compressedStream.Length);
zipStream.Dispose();
}
for (int i = 0; i <= 11; i++)
{
// Kopiere den Text in einen MemoryStream
var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(text));
var compressedStream = new MemoryStream();
using var brotliStream = new BrotliStream(compressedStream, new BrotliCompressionOptions() { Quality = i });
uncompressedStream.CopyTo(brotliStream);
brotliStream.Flush();
Console.WriteLine($"Länge bei Brotli-Komprimierungslevel #{i}: " + compressedStream.Length);
brotliStream.Dispose();
//// Dekomprimiere den Text wieder
//compressedStream.Position = 0;
//var decompressedStream = new MemoryStream();
//using var brotliDecompressionStream = new BrotliStream(compressedStream, CompressionMode.Decompress);
//brotliDecompressionStream.CopyTo(decompressedStream);
//brotliDecompressionStream.Flush();
//Console.WriteLine("Dekomprimierter Text);
//string text2 = Encoding.UTF8.GetString(decompressedStream.ToArray());
//Console.WriteLine("Dekomprimierter Text: " + text2.Length);
}
}
}
(Bild: Screenshot (Holger Schwichtenberg))
(Bild: coffeemill/123rf.com)
Das nächste LTS-Release steht an: Auf der Online-Konferenz betterCode() .NET 10.0 am 18. November 2025 – ausgerichtet von iX und dpunkt.verlag in Kooperation mit IT-visions.de – präsentieren der Autor dieses Artikels, Dr. Holger Schwichtenberg, und weitere Experten die wichtigsten Neuerungen. Dazu zählen die Updates im .NET 10.0 SDK sowie in C# 14.0, ASP.NET Core 10.0, Blazor 10.0, Windows Forms 10.0, WPF 10.0, WinUI 3, .NET MAUI 10.0 und die Integration von Künstlicher Intelligenz in .NET-Anwendungen.
Das Programm ist noch nicht veröffentlicht – bis dahin sind vergünstigte Blind-Bird-Tickets bereits im Online-Shop erhältlich. Das Vorjahresprogramm lässt sich im Archiv einsehen.
(rme)