压缩传输,数据源源不断,助数据远行高飞 - compress dataset with .net 1.1
好久没来这里更新了!糊乱讲点啥吧!
.net的最强势就是使得数据在Internet上自由传输。
和远程数据库打交道,很多.net的项目都用到了WebService,WebService除了可以传输一些基本的类型:int、Byte、string等等,还可以传输那些可以XML序列化的对象,比如DataSet!
Dataset定义如下:
.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
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!
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!