1, SOAPFomatter
2, BinaryFomatter
3,SOAPFomatter + SharpZipLib
4,BinaryFomatter + SharpZipLib
5, DataSetSurrogate (http://support.microsoft.com/default.aspx?scid=kb;en-us;829740)
6, DataSetSurrogate + SharpZipLib
7, PAB.CompressDataSet.Wrapper (http://www.eggheadcafe.com/articles/20031219.asp)
若論壓縮效果,第7種辦法是最優(yōu)秀的,第2名是第6種辦法。
若論速度,第7種和第6種幾乎差不多。。。(最快的好像是第2種)
PAB.CompressDataSet.Wrapper 據上文所說(shuō),乃是通過(guò)反向工程.NET Compact Framework而得到的壓縮代碼,我估計它也采用了類(lèi)似于DataSetSurrogate那樣的替代對象來(lái)存儲。本來(lái)我是很傾向使用這個(gè)方法的,可惜這個(gè)咚咚沒(méi)有源碼(且DLL加了混淆)。。。而反觀(guān)第6種,我們則可以輕松坐擁全部源碼,所以最后我還是選擇了第6種辦法的。下面的一點(diǎn)代碼,可供各位曬笑:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Data;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
/// <summary>
/// 壓縮數據集
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
public static byte[] CompressDS(DataSet 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;
}
/// <summary>
/// 解壓數據集
/// </summary>
/// <param name="byt"></param>
/// <returns></returns>
public static DataSet DecompressDS(byte[] byt)
{
MemoryStream ms = new MemoryStream(byt);
BinaryFormatter bf = new BinaryFormatter();
ZipInputStream zis = new ZipInputStream(ms);
zis.GetNextEntry();
DataSetSurrogate dss = (DataSetSurrogate)bf.Deserialize(zis);
zis.Close();
ms.Close();
DataSet ds = dss.ConvertToDataSet();
return ds;
}
基于SharpZipLib實(shí)現上面兩個(gè)函數后,DS壓縮的任務(wù)就完成了。BTW,VS2005里邊,.NET FW 自帶了CompressStream,我們可以跟SharpZipLib說(shuō)再見(jiàn)了:)
至于WS怎么傳輸,在CSDN上看到Tomgus (小橋流水) 老兄轉載的http://www.cnblogs.com/flyskywlh/archive/2005/08/18/217382.html,乃Flyskywlh老兄的大作。
首先我也很同意使用byte[]數組傳輸,非常方便。至于具體WebMethod的方式,我在實(shí)際應用中是大量使用實(shí)體WebMthod的,比如:
[WebMethod]
public DataSet GetOrders() {}; //獲取所有訂單
[WebMethod]
public DataSet UpdateOrders(DataSet dsOrders){}; //更新指定訂單
因為采取這種模式,所以系統里邊有極多的WebMethod(WinformUI僅通過(guò)WS交互),一個(gè)標準WM的調用流程是:
客戶(hù)端壓縮WM中所有DS型的參數-〉調用WM-〉服務(wù)器端解壓所有DS型的參數-〉執行實(shí)際WM-〉對DS型的返回值進(jìn)行壓縮-〉客戶(hù)端接收并解壓得出結果DS
上述流程的具體實(shí)現很麻煩,在客戶(hù)端用了AOP的透明代理的概念;服務(wù)器端則用了動(dòng)態(tài)調用WS的技術(shù)。實(shí)現這種“雙代理”的模式后,對于WS端或Winform端,壓縮與不壓縮變得透明了,兩方面的程序員都不用再關(guān)心這個(gè)問(wèn)題了。而且我覺(jué)得“雙代理”還可以為我們處理其他很多的問(wèn)題,比如排隊,異步操作,權限等等。那位朋友||大拿||高人有興趣探討這個(gè)問(wèn)題的,小可甚喜!
聯(lián)系客服