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

转载 2006年05月21日 15:27:00
其实这个标题很大,实现起来也可以有许多的办法。甚至,应否这样做也许都能惹出许多的争论(比如,为什么用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端,压缩与不压缩变得透明了,两方面的程序员都不用再关心这个问题了。而且我觉得“双代理”还可以为我们处理其他很多的问题,比如排队,异步操作,权限等等。那位朋友||大拿||高人有兴趣探讨这个问题的,小可甚喜!

webservice用于大数据量传输的处理

1.    直接返回DataSet对象 特点:通常组件化的处理机制,不加任何修饰及             处理; 优点:代码精减、易于处理,小数据量处理较快; 缺点:大数据量的传递处理慢,...
  • xiyangxiwen
  • xiyangxiwen
  • 2013年11月19日 12:49
  • 2233

.net webservice中如果dataset中有null值会导致生成的XML缺少字段节点

在做android&webservice项目的时候碰到ksoap2解析XML文件因缺少字段导致报错的问题.后来发现问题是由webservice中dataset里该字段有null值导致的。因为datas...
  • wangtengwh
  • wangtengwh
  • 2016年09月17日 12:15
  • 691

Android利用Soap读取WebService并且解析XML的DataSet数据

一、Soap的结构 调用webService需要以下几个参数:命名空间、Soap Action、WSDL的URL、方法名。接下来以调用火车列车信息数据为例,webService地址为:webse...
  • quentain
  • quentain
  • 2015年11月16日 11:31
  • 1137

Android中用Ksoap获取标准webservice接口返回的复杂对象Dataset学习

近日项目用到Ksoap2访问标准webservice,且fan
  • Don_Leah
  • Don_Leah
  • 2014年10月16日 21:34
  • 2052

java—(6)OpenAdaptor:基于webservice传输大文件

OpenAdaptor支持XFire和CXF开发的webservice,所以开发CXF webservice,基于myeclipse开发比较容易。参照网上webrvice传输大文件示例修改 http:...
  • szh1124
  • szh1124
  • 2015年05月22日 11:42
  • 1496

webservice大数据量传输时的压缩和解压缩

当访问WebSerivice时,如果数据量很大,传输数据时就会很慢。为了提高速度,我们就会想到对数据进行压缩。首先我们来分析一下。         当在webserice中传输数据时,一般都采用Da...
  • fox123871
  • fox123871
  • 2013年05月17日 11:19
  • 675

wcf传输Dataset大数据量(转)

http://www.th7.cn/Program/net/201309/148486.shtml   由于WCF不能传输DataTable(不能序列化),所以更多项目中都会使用DataSet作为...
  • zunguitiancheng
  • zunguitiancheng
  • 2014年03月29日 12:13
  • 742

WebService体系之——复杂对象的传递

摘要:进一步实现传递List、Map、Array类型的JavaBean的集合。
  • chenghuaying
  • chenghuaying
  • 2014年03月03日 14:39
  • 3144

webservicejava上传大文件

 java web service 大文件上传/下载 DataHandler 传输小体积文件(不超过10M)通常采用byte[]来容纳数据内容。开发过程中,通常是以下面给出的代码形式来定义...
  • z507263441
  • z507263441
  • 2014年06月27日 20:01
  • 7028

Android利用Soap读取WebService并且解析XML的DataSet数据

摘抄至:http://blog.csdn.net/comeonyangzi/article/details/25722275
  • mxbhxx
  • mxbhxx
  • 2014年06月19日 10:33
  • 2587
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebService传输DataSet的一点想法和实践
举报原因:
原因补充:

(最多只允许输入30个字)