xml web service
再序列化,通過WebService傳輸,客戶端接收,再反序列化,確實效果大大的優於直接傳送DataSet,不僅網路傳輸中如此,即使本機,效能改善也非常明顯.
下面分別是WebService裡面的方法和客戶端反序列化取DataSet的方法.
1. 伺服器上面取資料,填充資料集,轉換為二進位制格式.
///
/// Method for users data query with binaryFormatter
///
///
///
public byte[] BinaryUserSelect(ref string err)
{
ClearCommand();
m_commandStringBuilder.Append("SELECT * FROM t_Users ;");
DataSet dsResult = new DataSet();
byte[] bArrayResult = null;
try
{
dsResult = SqlHelper.ExecuteDataset(m_currentConnectionString, CommandType.Text, m_commandStringBuilder.ToString());
// 上面都是取資料的,無需關心.二進位制壓縮資料集是下面一小段
dsResult.RemotingFormat = SerializationFormat.Binary;
MemoryStream ms = new MemoryStream();
IFormatter bf = new BinaryFormatter();
bf.Serialize(ms, dsResult);
bArrayResult = ms.ToArray();
ms.Close();
//
}
catch (Exception ee)
{
err = ee.ToString();
}
return bArrayResult;
}
2. 通過WebService把byte[]格式的資料傳送到客戶端,這裡就是WebService自己的事情了,我們無需關心
3.客戶端接收到byte[]格式的資料,對其進行反序列化,得到資料集,進行客戶端操作.
///
/// Get user data with Binary format
///
///
public DataSet GetBinaryUserData()
{
string err = "";
byte[] bUserData = svc.ByteArrayUserSelect(ref err);
if (err != "")
{
MessageBox.Show(err);
err = "";
return null;
}
// 反序列化的過程
MemoryStream ms = new MemoryStream(bUserData);
IFormatter bf = new BinaryFormatter();
object bj = bf.Deserialize(ms);
DataSet dsResult = (DataSet)obj;
//
ms.Close();
return dsResult;
}
同樣一臺機器,手工生成12000條資料,在本地使用WebService分別讀取、傳輸並在客戶端顯示資料集和byte[]格式的資料,前者平均時間2.3秒,後者平均時間為1.7秒,之間的差別僅在傳輸過程的格式,還有後者需要的序列化和反序列化的時間.本地WebService傳輸的差別尚且如此,通過網路傳輸的時間優化自然會更明顯..
.net1.1下面微軟提供的DataSetSurrogate開發包下載地址:http://support.microsoft.com/default.aspx?scid=kb;en-us;829740 DataSetSurrogate 在.net 2.0裡自帶
在.net1.1下的實現方式例項如下
在這裡,有兩種方式:可把序列化後的資料用檔案形式儲存在客戶端硬碟;也可用Byte[]方式傳回客戶端,以下是程式碼。
web service 端(檔案形式)
[WebMethod(Description="迴圈獲取遠端DATASET")]
public void SurrogateReadTable(string TableName)
{
//把DataSet通過Surrogate Class 序列化成 Binary Stream
DataSet ds;
ds=SqlHelper.ExecuteDataset(cnn,CommandType.Text,"select * from "+TableName);
//例項化DataSetSurrogate,傳取出的DATASET到建構函式裡
sds = new DataSetSurrogate(ds);
//例項化二進位制流
BinaryFormatter bf=new BinaryFormatter();
StreamWriter swDat;
//寫到本地一個檔案裡
swDat = new StreamWriter(@"c:\output_surrogate_dataset.dat");
bf.Serialize(swDat.BaseStream, sds);
//這裡可以知道序列化後的檔案的大小
long size = swDat.BaseStream.Length;
swDat.Close();
}
客戶端
private void button1_Click(object sender, System.EventArgs e)
{
label1.Text=DateTime.Now.ToString();
button1.Enabled=false;
//反序列化Binary Stream能通過Surrogate Class轉換成 DataSet
//從WEB SERVICE上讀取方法
svs.SurrogateRead("t_busdocbase");
BinaryFormatter bf=new BinaryFormatter();
StreamReader swDat;
swDat = new StreamReader(@"c:\output_surrogate_dataset.dat");
object o=bf.Deserialize(swDat.BaseStream);
DataSet ds;
sds = (DataSetSurrogate) o;
ds = sds.ConvertToDataSet();
dataGrid1.DataSource=ds.Tables[0];
swDat.Close();
}
web service 端(Byte[]方式)
[WebMethod(Description="獲取業務資料遠端DATASET")]
public byte[] SurrogateRead1()
{
DataSet ds;
ds=SqlHelper.ExecuteDataset(cnn,CommandType.Text,"select * from t_busdocbase");
sds = new DataSetSurrogate(ds);
MemoryStream s= new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(s,sds);
byte[] e = s.ToArray();
return e;
}
客戶端
private void button3_Click(object sender, System.EventArgs e)
{
label1.Text=DateTime.Now.ToString();
button3.Enabled=false;
//*反序列化Binary Stream能通過Surrogate Class轉換成 DataSet*/
//從WEB SERVICE上讀取方法
byte [] bb=svs.SurrogateRead1();
MemoryStream br=new MemoryStream(bb);
BinaryFormatter bf=new BinaryFormatter();
object o=bf.Deserialize(br);
sds = (DataSetSurrogate) o;
ds = sds.ConvertToDataSet();
dataGrid1.DataSource=ds.Tables[0];
br.Close();
}
我個人覺得用byte[]方式會安全些,畢竟不用在客戶端產生檔案,不用擔心資料的安全。
在2.0 中對資料集序列化和反序列化的方法進行了一下簡單的封裝,使其可以得到重用的效果.見下面的類DatFormatter.
通過GetBinaryFormatData方法可以轉換資料集為二進位制,在伺服器端使用,轉換資料集格式。傳送,客戶端接收,得到二進位制格式資料,使用RetrieveDataSet方法,反序列化,得到資料集,進行客戶端操作。通過這些簡單的操作(序列化和反序列化,將資料壓縮),可以使資料集等體積龐大的物件在遠端傳遞中的時間大大減少,並且可以減少網路中斷等問題對程式的影響。
1using System;
2using System.IO;
3using System.Data;
4using System.Runtime.Serialization;
5using System.Runtime.Serialization.Formatters.Binary;
6
7namespace Common
8{
9 public class DataFormatter
10 {
11 private DataFormatter() { }
12 ///
13 /// Serialize the Data of dataSet to binary format
14 ///
15 ///
16 ///
17 static public byte[] GetBinaryFormatData(DataSet dsOriginal)
18 {
19 byte[] binaryDataResult = null;
20 MemoryStream memStream = new MemoryStream();
21 IFormatter brFormatter = new BinaryFormatter();
22 dsOriginal.RemotingFormat = SerializationFormat.Binary;
23
24 brFormatter.Serialize(memStream, dsOriginal);
25 binaryDataResult = memStream.ToArray();
26 memStream.Close();
27 memStream.Dispose();
28 return binaryDataResult;
29 }
30 ///
31 /// Retrieve dataSet from data of binary format
32 ///
33 ///
34 ///
35 static public DataSet RetrieveDataSet(byte[] binaryData)
36 {
37 DataSet dataSetResult = null;
38 MemoryStream memStream = new MemoryStream(binaryData);
39 IFormatter brFormatter = new BinaryFormatter();
40
41 object bj = brFormatter.Deserialize(memStream);
42 dataSetResult = (DataSet)obj;
43 return dataSetResult;
44 }
45 }
46}
47
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-539621/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼是web service?- SOAP Web Service & Restful Web ServiceWebREST
- not found service definition in jdonframework.xmlFrameworkXML
- Web Service 教程Web
- RESTful Web Service(續)RESTWeb
- Web Service 基礎Web
- Web Service入門Web
- web.xml作用WebXML
- 教你入門Web ServiceWeb
- Spring Web Service教程SpringWeb
- Web Service 的工作原理Web
- ASP 呼叫WEB SERVICE 文件Web
- c#呼叫web serviceC#Web
- Web service是什麼?Web
- XML安全之Web ServicesXMLWeb
- web.xml的作用WebXML
- web.xml之一WebXML
- 關於web.xmlWebXML
- web.xml詳解WebXML
- Android中的Web ServiceAndroidWeb
- Java:Web Service初入門JavaWeb
- Web Service 之 Python -- spyneWebPython
- Loadrunner11 --web serviceWeb
- web service相關轉摘Web
- iPhone 呼叫Web Service 例子(轉)iPhoneWeb
- c# web service轉貼C#Web
- 什麼是Web Service (轉)Web
- WCF、Web API、WCF REST、Web Service之區別WebAPIREST
- web.xml相關配置WebXML
- websphere中web.xml配置WebXML
- web.xml元素介紹WebXML
- web到service簡單原理例子Web
- 什麼是 Web Service--面試Web面試
- web service 的事務問題Web
- 為什麼需要Web Service (轉)Web
- C# Web Service 身份驗證C#Web
- 搞懂 XML 解析,徒手造 WEB 框架XMLWeb框架
- maven專案增加web.xmlMavenWebXML
- Struts2 web.xml(七)WebXML