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中你还是得忍受这种不和谐的代码。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值