首先需要下载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的瓶颈是在通讯上,因为数据量太大,所以使用压缩见效