? 设置RemotingFormat = SerializationFormat.Binary;再序列化,通过WebService传输,客户端接收,再反序列化,确实效果大大的优于直接传送DataSet,不仅网络传输中如此,即使本机,性能改善也非常明显.
? ? ? 下面分别是WebService里面的方法和客户端反序列化取DataSet的方法.
? ? ? 1. 服务器上面取数据,填充数据集,转换为二进制格式.
? ? ??
- ??
- ??????
- ??????
- ///?<param?name="err"></param>??
- ///?<returns></returns>??
- ????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[]格式的数据,对其进行反序列化,得到数据集,进行客户端操作.
? ? ?
?????????
- ?????????
- ???????public?DataSet?GetBinaryUserData()??
- ???????{??
- ???????????string?err?=?"";??
- ???????????byte[]?bUserData?=?svc.ByteArrayUserSelect(ref?err);??
- if?(err?!=?"")??
- ???????????{??
- ???????????????MessageBox.Show(err);??
- ???????????????err?=?"";??
- ???????????????return? ???????????}??
- ?????????????
- ???????????MemoryStream?ms?=?new?MemoryStream(bUserData);??
- ???????????IFormatter?bf?=?new?BinaryFormatter();??
- object?obj?=?bf.Deserialize(ms);??
- ???????????DataSet?dsResult?=?(DataSet)obj;??
- ?????????????
- ???????????ms.Close();??
- return?dsResult;??
- ???????}??
? ? ??
? ? ?同样一台机器,手工生成12000条数据,在本地使用WebService分别读取、传输并在客户端显示数据集和byte[]格式的数据,前者平均时间2.3秒,后者平均时间为1.7秒,之间的差别仅在传输过程的格式,还有后者需要的序列化和反序列化的时间.本地WebService传输的差别尚且如此,通过网络传输的时间优化自然会更明显..
? ? 在2.0 中对数据集序列化和反序列化的方法进行了一下简单的封装,使其可以得到重用的效果.见下面的类DatFormatter.通过GetBinaryFormatData方法可以转换数据集为二进制,在服务器端使用,转换数据集格式。发送,客户端接收,得到二进制格式数据,使用RetrieveDataSet方法,反序列化,得到数据集,进行客户端操作。通过这些简单的操作(序列化和反序列化,将数据压缩),可以使数据集等体积庞大的对象在远程传递中的时间大大减少,并且可以减少网络中断等问题对程序的影响。
using?System;??
- using?System.IO;??
- using?System.Data;??
- using?System.Runtime.Serialization;??
- using?System.Runtime.Serialization.Formatters.Binary;??
- ??
- namespace?Common??
- {??
- ????class?DataFormatter??
- ????{??
- private?DataFormatter()?{?}??
- ??????????
- ??????????
- ///?</summary>??
- ///?<param?name="dsOriginal"></param>??
- ///?<returns></returns>??
- static?byte[]?GetBinaryFormatData(DataSet?dsOriginal)??
- ????????{??
- ????????????byte[]?binaryDataResult?=?null;??
- ????????????MemoryStream?memStream?=?new?MemoryStream();??
- ????????????IFormatter?brFormatter?=?new?BinaryFormatter();??
- ????????????dsOriginal.RemotingFormat?=?SerializationFormat.Binary;??
- ??
- ????????????brFormatter.Serialize(memStream,?dsOriginal);??
- ????????????binaryDataResult?=?memStream.ToArray();??
- ????????????memStream.Close();??
- ????????????memStream.Dispose();??
- ????????????return?binaryDataResult;??
- ????????}??
- ///?Retrieve?dataSet?from?data?of?binary?format??
- ///?<param?name="binaryData"></param>??
- public?DataSet?RetrieveDataSet(byte[]?binaryData)??
- ????????{???
- ????????????DataSet?dataSetResult?=?new?MemoryStream(binaryData);??
- object?obj?=?brFormatter.Deserialize(memStream);??
- ????????????dataSetResult?=?(DataSet)obj;??
- return?dataSetResult;??
- ????????}??
- ????}??
- }??
C#解决办法,已经在例子中实现!?
WebServices:?
一个叫:GetBkmlDataStr()的函数,返回XML字符流。?
......?
return ds.GetXml().ToString();?
.net客户端转换成dataset:?
DataSet ds=new DataSet();?
localhost.Service1 ltsr=new localhost.Service1();?
ds.ReadXml(new StringReader(ltsr.GetBkmlDataStr(tb_bkdh.Text)));?
dataGrid1.DataSource = ds.Tables[0];?
转载:http://blog.csdn.net/qiujialongjjj/article/details/20033943
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|