Delen via


DeflateStream en GZipStream schrijven kop- en voetteksten voor lege nettolading

DeflateStream en GZipStream schrijf nu altijd kop- en voetteksten naar de uitvoerstroom, zelfs als er geen gegevens worden geschreven. Dit zorgt ervoor dat de uitvoer een geldige gecomprimeerde stroom is volgens de specificaties deflate en GZip.

Geïntroduceerde versie

.NET 11 Preview 1

Vorig gedrag

Voorheen produceerden DeflateStream en GZipStream geen output als er geen gegevens naar de stream werden geschreven. Dit heeft geresulteerd in een lege uitvoerstroom bij het comprimeren van een lege invoer.

using var output = new MemoryStream();
using (var deflate = new DeflateStream(output, CompressionMode.Compress))
{
    // No data written.
}
Console.WriteLine(output.Length); // 0

Nieuw gedrag

Vanaf .NET 11 DeflateStream en GZipStream altijd de juiste kop- en voetteksten naar de uitvoerstroom schrijven, zelfs als er geen gegevens worden geschreven. Dit zorgt ervoor dat de uitvoer geldige gecomprimeerde gegevens bevat volgens de indelingsspecificaties.

using var output = new MemoryStream();
using (var deflate = new DeflateStream(output, CompressionMode.Compress))
{
    // No data written.
}
Console.WriteLine(output.Length); // 2 (for Deflate) or 20 (for GZip).

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deflate- en GZip-compressieindelingen omvatten scheidingstekens voor het begin en het einde van gecomprimeerde gegevens. De juiste manier om een lege nettolading met deze indelingen te comprimeren, bevat alleen de scheidingstekens. Sommige hulpprogramma's reageren niet correct op lege inhoud en verwachten altijd dat de gecomprimeerde inhoud ten minste de juiste kop- en voettekst bevat. Deze wijziging zorgt voor compatibiliteit met dergelijke hulpprogramma's en produceert correct opgemaakte gecomprimeerde streams volgens de specificaties.

Als het vorige gedrag gewenst is, behandel dan lege inhoud als een speciaal geval om het niet te comprimeren via DeflateStream of GZipStream.

byte[] dataToCompress = GetData();

if (dataToCompress.Length == 0)
{
    // Don't compress empty data.
    return Array.Empty<byte>();
}

using var output = new MemoryStream();
using (var deflate = new DeflateStream(output, CompressionMode.Compress))
{
    deflate.Write(dataToCompress);
}
return output.ToArray();

Als u onderscheid wilt maken tussen lege en niet-lege gecomprimeerde streams, houd bij of er gegevens zijn geschreven of controleer de oorspronkelijke niet-gecomprimeerde gegevenslengte vóór compressie.

Betreffende API's