藉由GZipStream的壓縮,來減少Web Service的傳輸量

来源:互联网 发布:mysql 数据库导出图解 编辑:程序博客网 时间:2024/06/11 06:42
1. 壓縮+Serialize

Web Service Side :

using System.IO;using System.IO.Compression;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;[WebMethod]public byte[] getZipData(){    DataSet ds = LoadData().Copy();    ds.RemotingFormat = SerializationFormat.Binary;    BinaryFormatter ser = new BinaryFormatter();    MemoryStream unMS = new MemoryStream();    ser.Serialize(unMS, ds);    byte[] bytes = unMS.ToArray();    int lenbyte = bytes.Length;     MemoryStream compMs = new MemoryStream();    GZipStream compStream = new GZipStream(compMs, CompressionMode.Compress, true);    compStream.Write(bytes, 0, lenbyte);     compStream.Close();    unMS.Close();    compMs.Close();    byte[] zipData = compMs.ToArray();    return zipData; }private DataSet LoadData(){//產生測試資料用    DataSet ds = new DataSet();    DataTable dt = new DataTable("Test");    dt.Columns.Add("ProID",typeof(int));    dt.Columns.Add("ProName", typeof(string));    dt.Columns.Add("CreateTime", typeof(DateTime));    dt.Columns["ProID"].AutoIncrement = true;    for (int i = 0; i < 100000; i++)    {        DataRow dr = dt.NewRow();        dr["ProName"] = Guid.NewGuid().ToString();        dr["CreateTime"] = DateTime.Now.ToString();        dt.Rows.Add(dr);    }    ds.Tables.Add(dt);    ds.AcceptChanges();    return ds;}

 

 

 

 

Client Side :

using System.IO.Compression;using System.IO;using System.Runtime.Serialization.Formatters.Binary;private void btn_ZipGet_Click(object sender, EventArgs e){    try    {        WS.Service1 wss = new WSZipDemo.WS.Service1();//WebReference        byte[] da = wss.getZipData();         MemoryStream input = new MemoryStream();        input.Write(da, 0, da.Length);        input.Position = 0;        GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);         MemoryStream output = new MemoryStream();        byte[] buff = new byte[4096];        int read = -1;        read = gzip.Read(buff, 0, buff.Length);        while (read > 0)        {            output.Write(buff, 0, read);            read = gzip.Read(buff, 0, buff.Length);        }        gzip.Close();        byte[] rebytes = output.ToArray();        output.Close();        input.Close();         MemoryStream ms = new MemoryStream(rebytes);        BinaryFormatter bf = new BinaryFormatter();        object obj = bf.Deserialize(ms);        DataSet ds = (DataSet)obj;        dataGridView1.DataSource = ds.Tables[0];    }    catch (Exception ex)    {        MessageBox.Show(ex.Message);    }}