webservice大資料量傳輸時的壓縮和解壓縮

來源:互聯網
上載者:User

當訪問WebSerivice時,如果資料量很大,傳輸資料時就會很慢。為了提高速度,我們就會想到對資料進行壓縮。首先我們來分析一下。

        當在webserice中傳輸資料時,一般都採用Dataset進行資料轉送。執行的過程就是先把Dataset轉化為xml進行傳輸,Dataset轉化為xml的格式如下:

<DataSetName>  <DataTableName>    <Column1Name>.......</Column1Name>    <Column2Name>.......</Column2Name>    <Column3Name>.......</Column3Name>  </DataTableName>.........<DataSetName>

很明顯的可以看到,Datase在t轉化為xml的過程中增加了大量的xml格式資料,這樣也就加大了傳輸量。

經過分析,我們就可以找到兩個解決資料轉送量大的問題的方法:

1.不直接使用Dataset來傳輸資料,避免轉化為xml時增加的額外資料。所以我們可以將Dataset轉化為DataSetSurrogate對象用Binary進行序列化,用位元據來傳輸資料。當然你也可以採用其他更好的方式,總之就是減少為了傳輸而增加的額外資料

2.對資料進行壓縮後再傳輸,至於壓縮的方法有很多,可以參考我的文章.net中壓縮和解壓縮的研究

 

參考代碼如下(這裡使用的是.net內建的Gzip進行壓縮的,壓縮效率可能不是太好):

//=========================================================================    //類名:DataSetZip    /// <summary>    /// 當DataSet中的資料量很大時,進行網路資料傳遞時,速度會很慢。    /// 本類將Dataset轉化為DataSetSurrogate對象用Binary進行序列化,    /// 然後進行壓縮之後進行傳輸,最後進行解壓縮    /// </summary>    /// <remarks>    /// 將DataSet中的DataTable中的資料進行轉換或複原    /// </remarks>    /*=========================================================================     變更記錄     序號       更新日期        開發人員      變更內容     001        2008/7/22       張          建立     =========================================================================*/    public class DataSetZip    {        //訊息ID        private const string MSG_ERR_INTERNAL = "MFWE00016";        /// <summary>        /// 取得將DataSet轉化為DataSetSurrogate對象用Binary進行序列化,並壓縮後的位元組        /// </summary>        /// <param name="dsData">需壓縮的DataSet資料</param>        /// <returns>壓縮後位元組</returns>        public static byte[] GetDataSetZipBytes(DataSet dsData)        {            try{            DataSetSurrogate dss = new DataSetSurrogate(dsData);            BinaryFormatter ser = new BinaryFormatter();            MemoryStream ms = new MemoryStream();            ser.Serialize(ms, dss);            byte[] buffer = ms.ToArray();            byte[] Zipbuffer = Compress(buffer);            return Zipbuffer;            }            catch (Exception ex)            {                throw new DataSetConverterException(MSG_ERR_INTERNAL, new string[] { "DataSetZip", "GetDataSetZipBytes" }, ex, null);            }        }        /// <summary>        /// 用.net內建的Gzip對位元組進行壓縮,壓縮比率可能不是太好        /// </summary>        /// <param name="data">位元組</param>        /// <returns>壓縮後位元組</returns>        public static byte[] Compress(byte[] data)        {            MemoryStream ms = new MemoryStream();            Stream zipStream = null;            zipStream = new GZipStream(ms, CompressionMode.Compress, true);            zipStream.Write(data, 0, data.Length);            zipStream.Close();            ms.Position = 0;            byte[] compressed_data = new byte[ms.Length];            ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));            return compressed_data;        }        /// <summary>        /// 對位元組進行解壓縮        /// </summary>        /// <param name="data">位元組</param>        /// <returns>解壓縮後的DataSet</returns>        public static DataSet Decompress(byte[] data)        {            try            {                byte[] buffer = null;                MemoryStream zipMs = new MemoryStream(data);                buffer = EtractBytesFormStream(zipMs, data.Length);                BinaryFormatter ser = new BinaryFormatter();                DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;                DataSet dsData = dss.ConvertToDataSet();                return dsData;            }            catch(Exception ex)            {                throw new DataSetConverterException(MSG_ERR_INTERNAL, new string[] { "DataSetZip", "Decompress" }, ex, null);            }        }        /// <summary>        /// 用.net內建的Gzip對資料流進行解壓縮        /// </summary>        /// <param name="zipMs">資料流</param>        /// <param name="dataBlock">資料長度</param>        /// <returns>解壓縮後的位元組</returns>        public static byte[] EtractBytesFormStream(MemoryStream zipMs, int dataBlock)        {            byte[] data = null;            int totalBytesRead = 0;            Stream zipStream = null;            zipStream = new GZipStream(zipMs, CompressionMode.Decompress);            while (true)            {                Array.Resize(ref data, totalBytesRead + dataBlock + 1);                int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);                if (bytesRead == 0)                {                    break;                }                totalBytesRead += bytesRead;            }            Array.Resize(ref data, totalBytesRead);            return data;        }    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.