压缩传输,数据源源不断,助数据远行高飞 - compress dataset with .net 1.1

好久没来这里更新了!糊乱讲点啥吧!

       .net的最强势就是使得数据在Internet上自由传输。
和远程数据库打交道,很多.net的项目都用到了WebService,WebService除了可以传输一些基本的类型:int、Byte、string等等,还可以传输那些可以XML序列化的对象,比如DataSet!
Dataset定义如下:

1 None.gif[Visual Basic]
2 None.gif<Serializable>
3 None.gifPublic Class DataSet
4 None.gif   Inherits MarshalByValueComponent
5 None.gif   Implements IListSource, ISupportInitialize, ISerializable

当然你也可以定义自己的实体,只要它可以XML序列化都可以在Internet上传输。通过一段时间用下来,发现通过WebService传输Dataset,或自己定义的实体,如果Client用户很多,往往会使IIS占用大量内存,而且速度也很慢。这时,我们潜意识中会想到压缩,既然问题出来了,为什么不压缩呢?压缩在中国可是有悠久的历史了,由于带宽太窄,所以下载的文件都是经过压缩的。

一般的思路就是压缩成二进制。谷歌一下,发现黎波兄的文章。
  http://www.cnblogs.com/upto/archive/2006/04/10/compresswebservice.html
把他的代码编译成了DLL,抽象出两个方法

 1 None.gif
 2 None.gif    ''' 压缩Dataset
 3 None.gif   Public Shared Function Compress(ByVal data As DataSet) As Byte()
 4 None.gif
 5 None.gif        Dim dss As New DataSetSurrogate(data)
 6 None.gif        Dim ser As New BinaryFormatter
 7 None.gif        Dim ms As New MemoryStream
 8 None.gif        ser.Serialize(ms, dss)
 9 None.gif        Dim buffer As Byte() = ms.ToArray()
10 None.gif
11 None.gif        Dim zipBuffer As Byte() = New CompressionHelper(CompressionLevel.BestSpeed).CompressToBytes(buffer)
12 None.gif
13 None.gif        Return zipBuffer
14 None.gif
15 None.gif    End Function
16 None.gif
17 None.gif    '解压缩Dataset
18 None.gif    Public Shared Function DeCompress(ByVal data As Byte()) As DataSet
19 None.gif
20 None.gif        Dim buffer As Byte() = New CompressionHelper(CompressionLevel.BestSpeed).DecompressToBytes(data)
21 None.gif        Dim ser As New BinaryFormatter
22 None.gif        Dim ms As New MemoryStream(buffer)
23 None.gif
24 None.gif        'Return ser.Deserialize(ms)
25 None.gif        Return CType(ser.Deserialize(ms), DataSetSurrogate).ConvertToDataSet
26 None.gif
27 None.gif    End Function

Demo 结构如下,请把CompresDataWithDotNet1.1WebService工程搞成Webservice


Demo是从Wevservice中取100000条数据,未压缩数据可压缩数据的比较!
压缩效果图:


大功告成!!

我原先对黎波兄的DataSetSurrogate这个类感到奇怪,直接Dataset序列化不就完了吗?为什么还要用DataSetSurrogate这个中间"层"?
我试了一下把DataSetSurrogate去掉,直接DataSet序列化,结果是发现速度超慢,把时间都用在序列化上面了!


源码下载


后继:

压缩并不局限于Dataset,把程序稍微改一改,可以压缩你定义的序列化实体!
你也可以加入一些数据加密解密的算法!
最近在学习.net 2.0,发现.net 2.0自带一些类,实现压缩,比如GZipStream压缩类,压缩比更高,数据更快,我会继续<<compress DataSet with .net 2.0>>,还有数据加密RSACryptoServiceProvider!


转载于:https://www.cnblogs.com/MasterCai/archive/2006/09/29/518270.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值