加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService下实现大数据量的传输

发布时间:2020-12-16 22:57:44 所属栏目:安全 来源:网络整理
导读:? 设置RemotingFormat = SerializationFormat.Binary; 再序列化,通过WebService传输,客户端接收,再反序列化,确实效果大大的优于直接传送DataSet,不仅网络传输中如此,即使本机,性能改善也非常明显. ? ? ? 下面分别是WebService里面的方法和客户端反序列化取Da

? 设置RemotingFormat = SerializationFormat.Binary;再序列化,通过WebService传输,客户端接收,再反序列化,确实效果大大的优于直接传送DataSet,不仅网络传输中如此,即使本机,性能改善也非常明显.

? ? ? 下面分别是WebService里面的方法和客户端反序列化取DataSet的方法.


? ? ? 1. 服务器上面取数据,填充数据集,转换为二进制格式.

? ? ??

[csharp]? view plain copy

在CODE上查看代码片

派生到我的代码片

  1. ///?<summary>??
  2. ????///?Method?for?users?data?query?with?binaryFormatter??
  3. ????///?</summary>??
  4. ///?<param?name="err"></param>??
  5. ///?<returns></returns>??
  6. ????public?byte[]?BinaryUserSelect(ref?string?err)??
  7. ????{??
  8. ????????ClearCommand();??
  9. ????????m_commandStringBuilder.Append("SELECT?*?FROM?t_Users?;");??
  10. ????????DataSet?dsResult?=?new?DataSet();??
  11. ????????byte[]?bArrayResult?=?null;??
  12. ????????try??
  13. ????????{????????????????????????????????
  14. ????????????dsResult?=?SqlHelper.ExecuteDataset(m_currentConnectionString,?CommandType.Text,?m_commandStringBuilder.ToString());??
  15. ????????????//?上面都是取数据的,无需关心.二进制压缩数据集是下面一小段??
  16. ????????????dsResult.RemotingFormat?=?SerializationFormat.Binary;??
  17. ????????????MemoryStream?ms?=?new?MemoryStream();??
  18. ????????????IFormatter?bf?=?new?BinaryFormatter();??
  19. ????????????bf.Serialize(ms,?dsResult);??
  20. ????????????bArrayResult?=?ms.ToArray();??
  21. ????????????ms.Close();??
  22. ????????????//???
  23. ????????}??
  24. catch?(Exception?ee)??
  25. ????????{??
  26. ????????????err?=?ee.ToString();??
  27. return?bArrayResult;??????????
  28. ????}??

? ? ?2. 通过WebService把byte[]格式的数据发送到客户端,这里就是WebService自己的事情了,我们无需关心

? ? ?3.客户端接收到byte[]格式的数据,对其进行反序列化,得到数据集,进行客户端操作.

? ? ?

派生到我的代码片

    ???????///?Get?user?data?with?Binary?format??
  1. ???????///?<returns></returns>??
  2. ???????public?DataSet?GetBinaryUserData()??
  3. ???????{??
  4. ???????????string?err?=?"";??
  5. ???????????byte[]?bUserData?=?svc.ByteArrayUserSelect(ref?err);??
  6. if?(err?!=?"")??
  7. ???????????{??
  8. ???????????????MessageBox.Show(err);??
  9. ???????????????err?=?"";??
  10. ???????????????return? ???????????}??
  11. ???????????//?反序列化的过程??
  12. ???????????MemoryStream?ms?=?new?MemoryStream(bUserData);??
  13. ???????????IFormatter?bf?=?new?BinaryFormatter();??
  14. object?obj?=?bf.Deserialize(ms);??
  15. ???????????DataSet?dsResult?=?(DataSet)obj;??
  16. ???????????//??
  17. ???????????ms.Close();??
  18. return?dsResult;??
  19. ???????}??
? ? ??

? ? ?同样一台机器,手工生成12000条数据,在本地使用WebService分别读取、传输并在客户端显示数据集和byte[]格式的数据,前者平均时间2.3秒,后者平均时间为1.7秒,之间的差别仅在传输过程的格式,还有后者需要的序列化和反序列化的时间.本地WebService传输的差别尚且如此,通过网络传输的时间优化自然会更明显..

? ? 在2.0 中对数据集序列化和反序列化的方法进行了一下简单的封装,使其可以得到重用的效果.见下面的类DatFormatter.通过GetBinaryFormatData方法可以转换数据集为二进制,在服务器端使用,转换数据集格式。发送,客户端接收,得到二进制格式数据,使用RetrieveDataSet方法,反序列化,得到数据集,进行客户端操作。通过这些简单的操作(序列化和反序列化,将数据压缩),可以使数据集等体积庞大的对象在远程传递中的时间大大减少,并且可以减少网络中断等问题对程序的影响。

[csharp]? view plain copy

在CODE上查看代码片

派生到我的代码片

    using?System;??
  1. using?System.IO;??
  2. using?System.Data;??
  3. using?System.Runtime.Serialization;??
  4. using?System.Runtime.Serialization.Formatters.Binary;??
  5. ??
  6. namespace?Common??
  7. {??
  8. ????class?DataFormatter??
  9. ????{??
  10. private?DataFormatter()?{?}??
  11. ????????///?<summary>??
  12. ????????///?Serialize?the?Data?of?dataSet?to?binary?format??
  13. ///?</summary>??
  14. ///?<param?name="dsOriginal"></param>??
  15. ///?<returns></returns>??
  16. static?byte[]?GetBinaryFormatData(DataSet?dsOriginal)??
  17. ????????{??
  18. ????????????byte[]?binaryDataResult?=?null;??
  19. ????????????MemoryStream?memStream?=?new?MemoryStream();??
  20. ????????????IFormatter?brFormatter?=?new?BinaryFormatter();??
  21. ????????????dsOriginal.RemotingFormat?=?SerializationFormat.Binary;??
  22. ??
  23. ????????????brFormatter.Serialize(memStream,?dsOriginal);??
  24. ????????????binaryDataResult?=?memStream.ToArray();??
  25. ????????????memStream.Close();??
  26. ????????????memStream.Dispose();??
  27. ????????????return?binaryDataResult;??
  28. ????????}??
  29. ///?Retrieve?dataSet?from?data?of?binary?format??
  30. ///?<param?name="binaryData"></param>??
  31. public?DataSet?RetrieveDataSet(byte[]?binaryData)??
  32. ????????{???
  33. ????????????DataSet?dataSetResult?=?new?MemoryStream(binaryData);??
  34. object?obj?=?brFormatter.Deserialize(memStream);??
  35. ????????????dataSetResult?=?(DataSet)obj;??
  36. return?dataSetResult;??
  37. ????????}??
  38. ????}??
  39. }??

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读