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

WebService传输DataSet的一点想法和实践

发布时间:2020-12-17 02:42:37 所属栏目:安全 来源:网络整理
导读:???? 其实这个标题很大,实现起来也可以有许多的办法。甚至,应否这样做也许都能惹出许多的争论(比如,为什么用WS而不是Remoting? 为什么传DataSet而不是Entity[]?)。 ?????? 由于DS的体态丰腴,选用何种序列化就很多的选择了,我尝试过如下方法: ?????

???? 其实这个标题很大,实现起来也可以有许多的办法。甚至,应否这样做也许都能惹出许多的争论(比如,为什么用WS而不是Remoting? 为什么传DataSet而不是Entity[]?)。
?????? 由于DS的体态丰腴,选用何种序列化就很多的选择了,我尝试过如下方法:

????? 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种办法是最优秀的,第2名是第6种办法。

  若论速度,第7种和第6种几乎差不多。。。(最快的好像是第2种)

  (区区年前曾做了一个详细的工程,分别用100/1000/10000条纪录对上述方法进行测试,然该工程很可能丢到抓娃国了,故详细数据暂且欠奉,待找回后当补充之)

  PAB.CompressDataSet.Wrapper 据上文所说,乃是通过反向工程.NET Compact Framework而得到的压缩代码,我估计它也采用了类似于DataSetSurrogate那样的替代对象来存储。本来我是很倾向使用这个方法的,可惜这个咚咚没有源码(且DLL加了混淆)。。。而反观第6种,我们则可以轻松坐拥全部源码,所以最后我还是选择了第6种办法的。下面的一点代码,可供各位晒笑:

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实现上面两个函数后,DS压缩的任务就完成了。BTW,VS2005里边,.NET FW 自带了CompressStream,我们可以跟SharpZipLib说再见了:)

  至于WS怎么传输,在CSDN上看到Tomgus (小桥流水) 老兄转载的http://www.cnblogs.com/flyskywlh/archive/2005/08/18/217382.html,乃Flyskywlh老兄的大作。

???? 首先我也很同意使用byte[]数组传输,非常方便。至于具体WebMethod的方式,我在实际应用中是大量使用实体WebMthod的,比如:

[WebMethod]

public DataSet GetOrders() {};??? //获取所有订单


[WebMethod]

public DataSet UpdateOrders(DataSet dsOrders){};???? //更新指定订单


  因为采取这种模式,所以系统里边有极多的WebMethod(WinformUI仅通过WS交互),一个标准WM的调用流程是:

  客户端压缩WM中所有DS型的参数-〉调用WM-〉服务器端解压所有DS型的参数-〉执行实际WM-〉对DS型的返回值进行压缩-〉客户端接收并解压得出结果DS

  上述流程的具体实现很麻烦,在客户端用了AOP的透明代理的概念;服务器端则用了动态调用WS的技术。实现这种“双代理”的模式后,对于WS端或Winform端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且我觉得“双代理”还可以为我们处理其他很多的问题,比如排队,异步操作,权限等等。那位朋友||大拿||高人有兴趣探讨这个问题的,小可甚喜!

(编辑:李大同)

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

    推荐文章
      热点阅读