(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