Entwicklung & Code
Neu in .NET 9.0 [25]: Einstellungen für die Komprimierung mit ZLib und Brotli
.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.
Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.
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.
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);
}
}
}
Die Ausgabe des Codebeispiels zeigt die Längen durch die unterschiedlichen Einstellungen für die Komprimierung.
(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)
✒ + 1.388944 BTC.NEXT - https://yandex.com/poll/T1TnDbUc4R9aLX7Nzhj1Cy?hs=34cde5feeac2fb74f0bd083c8c166d46& ✒
Juni 15, 2025 at 1:35 pm
ktrsbq