好久沒來這裡更新了!糊亂講點啥吧!
.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佔用大量記憶體,而且速度也很慢。這時,我們潛意識中會想到壓縮,既然問題出來了,為什麼不壓縮呢?壓縮在中國可是有悠久的曆史了,由於頻寬太窄,所以下載的檔案都是經過壓縮的。
一般的思路就是壓縮成二進位。Google一下,發現黎波兄的文章。
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!