首先需要下載SharpZipLib,下載地址:http://icsharpcode.github.io/SharpZipLib/
需要引入命名空間:
using ICSharpCode.SharpZipLib.GZip;
using System.IO;
壓縮、解壓縮
public static byte[] CompressGZip(byte[] rawData)
{
MemoryStream ms = new MemoryStream();
GZipOutputStream compressedzipStream = new GZipOutputStream(ms);
compressedzipStream.Write(rawData, 0, rawData.Length);
compressedzipStream.Close();
return ms.ToArray();
}
public static byte[] UnGZip(byte[] byteArray)
{
GZipInputStream gzi = new GZipInputStream(new MemoryStream(byteArray));
MemoryStream re = new MemoryStream(50000);
int count;
byte[] data = new byte[50000];
while ((count = gzi.Read(data, 0, data.Length)) != 0)
{
re.Write(data, 0, count);
}
byte[] overarr = re.ToArray();
return overarr;
}
測試代碼:
public static void GZipTest()
{
string testdata = "aaaa11233GZip壓縮和解壓";
byte[] gzipdata = Tools.CompressGZip(Encoding.UTF8.GetBytes(testdata));
byte[] undata = Tools.UnGZip(gzipdata);
Debug.Log("[GZipTest] : data" + Encoding.UTF8.GetString(undata));
}
一個效率對比的案例:
使用WebService返回從數據庫查詢的數據5W條。
第一種情況:
DataSet + DataSetSurrogate + BinaryFomatter
返回的Byte數量爲8 801 983
時間:調用WebService:10+秒左右,解壓:2秒左右
第二種情況:
DataSet + DataSetSurrogate + BinaryFomatter + SharpZipLib
返回的Byte數量爲1 259 938
時間:調用WebService:14+秒左右,解壓:4+秒左右
當數據條數增加爲10W的時候:
第一種情況:
DataSet + DataSetSurrogate + BinaryFomatter
時間:調用WebService:40+秒左右,解壓:5秒左右
第二種情況:
DataSet + DataSetSurrogate + BinaryFomatter + SharpZipLib
時間:調用WebService:47+秒左右,解壓:10+秒左右
代碼:
第一種情況:
DataSet + DataSetSurrogate + BinaryFomatter
[WebMethod]
public byte [] GetDataSetZip()
{
string connString = @”server=localhost;database=NorthWind;uid=sa;pwd=vault”;
string sqlString = @” SELECT top 100000* FROM Orders”;
SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter apter = new SqlDataAdapter(sqlString,conn);
DataSet ds = new DataSet();
apter.Fill(ds);
DataSetSurrogate dss = new DataSetSurrogate(ds);
MemoryStream s= new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(s,dss);
byte[] ret = s.ToArray();
return ret;
}
第二種情況:
DataSet + DataSetSurrogate + BinaryFomatter + SharpZipLib
[WebMethod]
public byte [] GetDataSetZip_SharpZipLib()
{
string connString = @”server=localhost;database=NorthWind;uid=sa;pwd=vault”;
string sqlString = @” SELECT top 100000* FROM Orders”;
SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter apter = new SqlDataAdapter(sqlString,conn);
DataSet ds = new DataSet();
apter.Fill(ds);
MemoryStream ms = new MemoryStream();
ZipOutputStream zos = new ZipOutputStream(ms);
zos.PutNextEntry(new ZipEntry(ds.DataSetName));
BinaryFormatter bf = new BinaryFormatter();
DataSetSurrogate dss = new DataSetSurrogate(ds);
bf.Serialize(zos, dss);
zos.CloseEntry();
zos.Close();
byte[] ret = ms.ToArray();
ms.Close();
return ret;
}
如果是在本地局域網WebService測試的話,網絡傳輸時間影響比較小,所以壓縮消耗的時間可能大於減少容量節約下來的時間,所以才導致測試結果如此,找個不太好的外部網絡環境作測試,壓縮數據集就可以很大程度提高傳輸效率了
在比較之前,你要選確定條件,比方網絡帶寬
如果你是局域網,速度很快,當然壓不壓縮都一樣,壓縮反而增加了CPU處理時間
如果是30幾K的貓,那麼光傳輸8M的數據就是N長時間,那麼就會發現壓縮的好處
使用WebServices傳輸DataSet的瓶頸是在通訊上,因爲數據量太大,所以使用壓縮見效