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

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

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

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

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

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

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


posted @ 2006-09-29 15:10 MasterCai 阅读(...) 评论(...) 编辑 收藏