一切福田,不離方寸,從心而覓,感無不通。

C#中将字符串通过GZipStream进行压缩时的注意事项

背景,

今天在写代码时要用到GZipStream来压缩需要Web传输的数据块。原本以为GZipStream Write ->Flush ->读取对应MemoryStream数据就Okay的事情,却总是得不到正确的结果。

研究,

经过查询MSDN,原来只有在GZipStream被Dispose后,对应的MemoryStream中才会有真正的压缩数据被写入。

以下是我用来测试的代码片段(红色部分为原来的错误调用,橙色部分是正确的调用方式)

string data = "<Root><PIGContent>test</PIGContent><RemoteUrl>http://www.a.com</RemoteUrl></Root>";

byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(data);
byte[] compressedbuffer = null;
//Compress buffer
MemoryStream ms = new MemoryStream();
using(GZipStream zs = new GZipStream(ms, CompressionMode.Compress,true))
{
zs.Write(buffer, 0, buffer.Length);

//下面两句被注释掉的代码有问题, 对应的compressedbuffer的长度只有10--该10字节应该只是压缩buffer的header

//zs.Flush();
//compressedbuffer = ms.ToArray();

}

//只有GZipStream在Dispose后调应对应MemoryStream.ToArray()所得到的Buffer才是我们需要的结果

compressedbuffer = ms.ToArray();

总结,

相信大家都会对GZipstream这种别扭的操作方式表示不满,微软对此也表示过歉意,但是由于其考虑到要兼容就的代码,因此即使在.Net 4.5中你还是得忍受这种不和谐的代码。

本篇小结如有不妥之处,烦请指正。

 

from: https://blog.csdn.net/missautumn/article/details/8351296