背景,
今天在写代码时要用到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中你还是得忍受这种不和谐的代码。
本篇小结如有不妥之处,烦请指正。