簡體   English   中英

在 C# 中使用 System.IO.Compression 壓縮內存中的對象

[英]Compressing an object in memory with System.IO.Compression in C#

我正在嘗試將一個類的實例(我們稱之為 Car)序列化為一個 xml,並將其在內存中壓縮為一個包含單個文件條目的 zip 文件。 我正在使用 System.IO.Compression.ZipArchive 類來做到這一點:

private byte[] CompressCar(Car car)
{
    using (var carStream = new MemoryStream())
    using (var zipStream = new MemoryStream())
    using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create))
    {
        new XmlSerializer(typeof(Car)).Serialize(carStream, car);
        ZipArchiveEntry entry = archive.CreateEntry("car.xml", CompressionLevel.Optimal);
        using (var zippedFileStream = entry.Open())
        {
            carStream.Seek(0, SeekOrigin.Begin);
            carStream.CopyTo(zippedFileStream);
        }
        return zipStream.ToArray();
    }
}

當我將壓縮的字節保存到文件中,然后嘗試使用 Windows 資源管理器打開它時,出現錯誤: 在此處輸入圖片說明 我在這里做錯了什么?

我尋找了其他 StackOverflow 條目,但找不到可以解決我的問題的任何內容。 我想在內存中壓縮它而不是使用臨時文件。

您需要在返回底層zipStream.ToArray()之前處理ZipArchive 例如,您可以提取以下輔助方法:

public static class SerializationExtensions
{
    public static byte[] ToCompressedXmlZipArchive<T>(T root, string entryName)
    {
        using (var zipStream = new MemoryStream())
        {
            using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create))
            {
                var entry = archive.CreateEntry(entryName, CompressionLevel.Optimal);
                using (var zippedFileStream = entry.Open())
                {
                    new XmlSerializer(typeof(T)).Serialize(zippedFileStream, root); // Possibly use root.GetType() instead of typeof(T)
                }
            }
            return zipStream.ToArray();
        }
    }
}

然后你的方法變成:

    private byte[] CompressCar(Car car)
    {
        return SerializationExtensions.ToCompressedXmlZipArchive(car, "car.xml");
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM