Table of Contents

Compression

Compression is often used with memory streams to reduce the size of data being stored or transmitted. This is particularly useful when dealing with large amounts of data or when bandwidth is limited.

.NET provides several classes for compression, including GZipStream and DeflateStream, which can be used in conjunction with memory streams. To simplify the process of compressing and decompressing data, this library provides helper classes such as MemoryStreamGZip and MemoryStreamDeflate. These classes offer a convenient way to handle compression without requiring manual management of the underlying streams.

Helper Classes

The full list of helper classes available for compression are:

  • MemoryStreamDeflate: A helper class that uses Deflate compression with a MemoryStreamSlim.
  • MemoryStreamGZip: A helper class that uses GZip compression with a MemoryStreamSlim.
  • MemoryStreamZLib: A helper class that uses ZLib compression with a MemoryStreamSlim.
  • MemoryStreamBrotli: A helper class that uses Brotli compression with a MemoryStreamSlim.

Examples

Using these helper classes is straightforward, as the usage pattern is consistent across all of them. Additionally, there is no need to manage intermediate streams manually.

Simple Data Compression

Here's an example of how to use MemoryStreamDeflate to compress data in the simplest case:

using KZDev.PerfUtils;

public class CompressionExample
{
    public MemoryStreamSlim CompressData(byte[] data)
    {
        return MemoryStreamDeflate.Compress(data);
    }
}

Compression With Options

Here's an example of how to use MemoryStreamDeflate to compress data using the best compression level by utilizing the options setup delegate overload:

using KZDev.PerfUtils;

public class CompressionExample
{
    public MemoryStreamSlim CompressDataWithSmallestSize(byte[] data)
    {
        return MemoryStreamDeflate.Compress(data, 
            options => options.WithCompressionLevel(CompressionLevel.SmallestSize));
    }
}

Simple Data Decompression

Here's an example of how to use MemoryStreamDeflate to decompress data:

using KZDev.PerfUtils;

public class CompressionExample
{
    public MemoryStreamSlim DecompressData(Stream compressedData)
    {
        return MemoryStreamDeflate.Decompress(compressedData);
    }
}

Decompression to String

Here's an example of how to decompress data directly to a string:

using KZDev.PerfUtils;

public class CompressionExample
{
    public string DecompressToString(Stream compressedData)
    {
        return MemoryStreamDeflate.DecompressToString(compressedData);
    }
}

Async Compression and Decompression

All compression helper classes support asynchronous operations:

using KZDev.PerfUtils;

public class CompressionExample
{
    public async Task<MemoryStreamSlim> CompressDataAsync(Stream source, CancellationToken cancellationToken)
    {
        return await MemoryStreamDeflate.CompressAsync(source, cancellationToken);
    }
    
    public async Task<MemoryStreamSlim> DecompressDataAsync(Stream source, CancellationToken cancellationToken)
    {
        return await MemoryStreamDeflate.DecompressAsync(source, cancellationToken);
    }
    
    public async Task<string> DecompressToStringAsync(Stream source, CancellationToken cancellationToken)
    {
        return await MemoryStreamDeflate.DecompressToStringAsync(source, cancellationToken);
    }
}

All the different compression classes support:

  • Compression from byte[], ReadOnlySpan<byte>, string, or Stream sources
  • Decompression from Stream sources, returning either a MemoryStreamSlim or a string
  • Asynchronous variants of both compression and decompression operations (CompressAsync, DecompressAsync, DecompressToStringAsync)
  • Options configuration via direct options objects or setup delegates for fine-grained control