2006年9月29日
壓縮傳輸,數據源源不斷,助數據遠行高飛 - compress dataset with .net 1.1
好久沒來這裏更新了!糊亂講點啥吧!
.net的最強勢就是使得數據在Internet上自由傳輸。
和遠程數據庫打交道,很多.net的項目都用到了WebService,WebService除了可以傳輸一些基本的類型:int、Byte、string等等,還可以傳輸那些可以XML序列化的對象,比如DataSet!
Dataset定義如下:
1
[Visual Basic]
2
<Serializable>
3
Public 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!