壓縮傳輸

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!

 

源文檔 <http://cache.baidu.com/c?word=datasetsurrogate%2C%D1%B9%CB%F5&url=http%3A//mastercai%2Ecnblogs%2Ecom/archive&b=0&a=4&user=baidu>

 
發佈了3 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章