使用SharpZipLib压缩C#对象?

时间:2018-03-27 08:33:55

标签: c# sharpziplib

是否可以使用SharpZipLib压缩List<T>? 将List转换为字节数组可以得到大约60000字节(未压缩)。

使用System.IO.Compression.DeflateStream进行压缩可以得到大约1/3的压缩率,但这还远远不够。

目的是将集合作为byte[]存储在(MS SQL)数据库中,因为将它们保存为单独的行会占用大量空间(每天100万行)。

由于

编辑:

List<ItemLog> itemLogs = new List<ItemLog>();
//populate with 1000 ItemLogs
byte[] array = null; //original byte array

BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, itemLogs);
array = ms.ToArray();

array大小现在为60000字节

Zip the collection using a ZipOutputStream

MemoryStream outputMemoryStream = new MemoryStream();
ZipOutputStream zipStream = new ZipOutputStream(outputMemoryStream);

zipStream.SetLevel(3);

ZipEntry entry = new ZipEntry("logs");
entry.DateTime = DateTime.Now;

zipStream.PutNextEntry(entry);

StreamUtils.Copy(ms, zipStream, new byte[4096]);
zipStream.CloseEntry();

zipStream.IsStreamOwner = false;
zipStream.Close();

outputMemoryStream.Position = 0;

byte[] compressed = outputMemoryStream.ToArray();

compressed现在大小为164字节。 &lt; - 长度无效/可能?

解压缩给了我一个空数组。但由于压缩不正确,我现在将跳过解压缩代码。

1 个答案:

答案 0 :(得分:1)

我的代码中没有任何实际问题。问题所在的唯一部分是复制数据。数据开头的输入数据流是否应该存储?尝试添加以下行:

ms.Seek(0, SeekOrigin.Begin); // added line
StreamUtils.Copy(ms, zipStream, new byte[4096]);

根据你的代码,我写了一个简单的压缩函数,它按预期工作。

private static byte[] Compress(byte[] source)
{
  byte[] compressed;
  using (var memory = new MemoryStream())
  using (var zipped = new ZipOutputStream(memory))
  {
    zipped.IsStreamOwner = false;
    zipped.SetLevel(9);
    var entry = new ZipEntry("data")
    {
      DateTime = DateTime.Now
    };
    zipped.PutNextEntry(entry);
#if true
    zipped.Write(source, 0, source.Length);
#else
    using (var src = new MemoryStream(source))
    {
      StreamUtils.Copy(src, zipped, new byte[4096]);
    }
#endif
    zipped.Close();
    compressed = memory.ToArray();
  }
#if false
  using (var file = new FileStream("test.zip", FileMode.Create, FileAccess.Write, FileShare.Read))
  {
    file.Write(compressed, 0, compressed.Length);
  }
#endif
  return compressed;
}

您可以选择如何保存输出(数组或流),并且已禁用代码将压缩数据保存到文件(以检入外部应用程序中的实际压缩内容数据)

我测试的数据是256字节长的(数据,压缩率很小),结果是407字节(文件)

尝试使用数组,或检查保存的流内容。