webservice---序列化和反序列化(針對網上DataSet優化)


只列出這四種數據的返回形式:

  (1)直接返回DataSet對象
  (2)返回DataSet對象用Binary序列化后的字節數組
  (3)返回DataSetSurrogate對象用Binary序列化后的 字節數組
  (4)返回DataSetSurrogate對象用Binary序列化並Zip 壓縮后的字節數組

DataSetSurrogate 類為微軟在2.0的時候提供的壓縮DataSet的類,下載/Files/fujinliang/DataSetSurrogate.rar

代碼如下:

 

 [WebMethod(Description = "直接返回DataSet對象")]
        public DataSet GetDataSet()
        {
            string connStr = System.Configuration.ConfigurationManager.AppSettings["ConnString"].ToString();
            SqlConnection conn = new SqlConnection(connStr);
            string sql = "select * from Base_Dic";
            conn.Open();
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet("China");
            sda.Fill(ds);
            conn.Close();
            return ds;
        }


        [WebMethod(Description = "直接返回DataSet對象,並用Binary序列化后的字節數組")]
        public byte[] GetDataSetBytes()
        {
            DataSet ds = GetDataSet();
            BinaryFormatter ser = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            ser.Serialize(ms, ds);
            byte[] buffer = ms.ToArray();
            return buffer;
        }

        [WebMethod(Description = "直接返回DataSetSurrogate對象,並且Binary序列化后的字節數組")]
        public byte[] GetDataSetSurrogateBytes()
        {
            DataSet ds = GetDataSet();

            DataSetSurrogate dss = new DataSetSurrogate(ds);
            BinaryFormatter ser = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            ser.Serialize(ms, dss);
            byte[] buffer = ms.ToArray();
            return buffer;
        }

        [WebMethod(Description="直接返回DataSetSurrogate對象,並且binary序列化后並且zip壓縮的字節數組")]
        public byte[] GetDataSetSurrogateZipBytes()
        {
            DataSet ds = GetDataSet();
            DataSetSurrogate dss = new DataSetSurrogate(ds);
            BinaryFormatter ser = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            ser.Serialize(ms, dss);
            byte[] buffer = ms.ToArray();
            byte[] bufferZip = ComPress(buffer);
            return bufferZip;
        }


        //壓縮方法
        public byte[] ComPress(byte[] data)
        {
            try
            {
                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;
            }
            catch
            {
                return null;
            }
        }

上面的代碼在網上比較多,經過測試也確實能優化實體的傳輸,上面測試的數據如下:

  (1)直接返回DataSet對象

           速度為00:00:01.
  (2)返回DataSet對象用Binary序列化后的字節數組

           速度比(1)快,傳輸的大小為30589
  (3)返回DataSetSurrogate對象用Binary序列化后的 字節數組

         速度比(1)快,傳輸的大小為12450
  (4)返回DataSetSurrogate對象用Binary序列化並Zip 壓縮后的字節數組

     速度比(1)快,傳輸的大小為4540

這四種方式第2,3,4的速度差不多,不過我的數據量不大,在數據量大的情況下,這種優勢將更新明顯,所以建議用(4)種方式來增加實體實例化的性能

 

上面的例子只是針對DataSet進行相關的優化,我們知道在webservice中如果直接使用復合類型,將產生大量的wsdl描述信息,這樣生成的xml將是很大的,

為了優化webservice的復合類型,最后還是對其進行序列化傳輸,序列化傳輸,使用的類庫在客戶端和服務端必須一樣,必須標志為[Serialization],不然將會報錯,上面的DataSetSurrogate必須新建一個類庫,在客戶端和服務端引用

對於其他的實體對象,我們也可以通過序列化來實現復合類型

缺點:webservice為不同的語言之間的調用提供了一個快速便捷的方法,但在跨平台的情況下,因為序列化和反序列化對二進制進行轉換的方式不一樣,所以此種功能將會受到限制,看具體平台的業務要求而定。

 

例子程序:服務端/Files/fujinliang/WebService.rar

客戶端:/Files/fujinliang/WindowsFormsApplication1.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM