其实这个标题很大,实现起来也可以有许多的办法。甚至,应否这样做也许都能惹出许多的争论(比如,为什么用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传输DataSet的一点想法和实践-.NET教程,Web Service开发相关推荐

  1. android studio访问webservice如何传递类对象报错_小白学习web service,这是最最最基础的了,只用JDK还不会吗?...

    Java Web Service实践 Web Service直接翻译就是网络服务. 主要为了解决各种语言,各种系统之间不兼容,通过SOAP(简单对象访问协议)实现互联互通. 其核心就是这个SOAP,通 ...

  2. WebService传输DataSet压缩与解压缩

    /// <summary>/// 压缩/// </summary>public static class ZipClass{/// <summary>/// 序列化 ...

  3. 技术人“结构化思维”训练的一点想法和实践

    "结构化思维"对于技术人员coding能力的升级至关重要,是一线互联网大厂升级为高工及技术专家的关键之一."结构化思维"对于应对网上甚嚣尘上的"35岁 ...

  4. Apache CXF实战之七 使用Web Service传输文件

    2019独角兽企业重金招聘Python工程师标准>>> 本文链接:http://blog.csdn.net/kongxx/article/details/7540930 Apache ...

  5. WebService 理论详解、JWS(Java Web Service) 快速入门

    目录 WebService (web服务)概述 WebService 平台技术 WebService 工作原理 WebService 开发流程 常见 Web Service 框架 JWS(Java W ...

  6. 采用web service传输超大数据

    因为以前也没有做过相关的web service开发,对于Xfire也只是知道有这么一个框架.当然现在它已经变成apache基金会旗下的一个开源项目CXF.不过,现在依旧有很多公司还在用Xfire作we ...

  7. Web Service入门简介(一个简单的WebService示例)

    一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intrane ...

  8. 关于标签系统的又一点想法。

    前段时间,写过一篇<关于标签系统的一点想法.>.但其实没有谈到里面的内容,是有一部分来自与刘鑫老师的聊天,当时他给了我许多肯定,也是让我觉得记录下来很有必要的原因. 前一篇里没有提到,我跟 ...

  9. 关于 nng/nanomsg 库的一点想法

    NNG/nanomsg 是最近项目上使用到的一个通信库,用来实现进程间过程调用和线程间通信,很是方便. NNG 是 nanomsg 的继任版本,而 nanomsg 则是流行的 ZMQ 的 C 重写版. ...

最新文章

  1. VS 2010测试解读2-给测试用例做标签
  2. 没有任何基础的可以学python吗-今天就来告诉你,没有编程基础的人适不适合学python...
  3. Python之多进程
  4. boost::fusion::as_vector用法的测试程序
  5. 杨元庆:乐Pad更适合中国消费者
  6. GIAC | 大数据分析系统在游戏领域的迭代与实践
  7. Windows驱动程序的加载
  8. hadoop2.4.2集群搭建及hive与mysql集成文档记录
  9. (29)System Verilog设计SPI接收
  10. 江苏省计算机二级c语言考试知识点,计算机二级考试C语言常考知识点归纳
  11. 深入理解java:1.1. 类加载器
  12. eclipse下androidannotations开发环境搭建
  13. 嗜血者高盛:北京上空的秃鹰?
  14. java生成pdf的流_Java 文件输出流.pdf
  15. 怎么清理ug10注册表_注册表清理优化工具用它就够了,赶紧上车!
  16. Win10安装乌班图18双系统
  17. labelimg的使用
  18. python 多张图片合成pdf_Python多图片合并PDF的方法
  19. golang binding tag
  20. kali linux网络扫描~局域网扫描

热门文章

  1. 跳蚤(POJ-1091)
  2. Vigenère密码(信息学奥赛一本通-T1402)
  3. 回文质数(洛谷-P1217)
  4. 信息学奥赛C++语言:单词转换
  5. SAP MM模块-实施顾问岗位-面试手册-MM模块技术面试清单
  6. 厉害了!VMware ESXi安装记录,附下载
  7. layui多文件上传讲解_layui d多文件上传(示例代码)
  8. 苏州大学计算机科学研究生,报录比最高专业TOP10!就离谱!
  9. c语言程序错误提示一个找不到,C语言编辑程序出现错误提示.doc
  10. php json 压缩传输,php json数据使用gzip压缩输出