http://blog.csdn.net/bodaowang/article/details/6889446

在webservice中将dataset序列化是我们经常遇到的问题,但是遇到很大的dataset,则网络传输就必须考虑的问题,将dataset处理压缩后传输是我们不错的选择,下面提供这种方法:

第一步:引入命名空间下载DataSetSurrogate组件

using System.IO.Compression;

using System.Runtime.Serialization.Formatters.Binary;

将下载好的DataSetSurrogate放入bin路径下

第二步:压缩序列化

///序列化转化为二进制数组的DataSet

public byte[] GetDataSetSurrogateZipBYtes(DataSet DS)

{

DataSetSurrogate dss = new DataSetSurrogate(DS);

///二进制方式方式序列化

BinaryFormatter ser = new BinaryFormatter();

MemoryStream ms = new MemoryStream();

ser.Serialize(ms, dss);

byte[] buffer = ms.ToArray();

///调用压缩方法

byte[] Zipbuffer = Compress(buffer);

return Zipbuffer;

}

///压缩二进制文件

private byte[] Compress(byte[] data)

{

MemoryStream ms = new MemoryStream();

Stream zipStream = null;

zipStream = new GZipStream(ms, CompressionMode.Compress, true);

///从指定的字节数组中将压缩的字节写入基础流

zipStream.Write(data, 0, data.Length);

zipStream.Close();

ms.Position = 0;

byte[] Compressed_Data = new byte[ms.Length];

ms.Read(Compressed_Data, 0, int.Parse(ms.Length.ToString()));

return Compressed_Data;

}

第三部:解压反序列化

///将压缩后的二进制数组解压

public static byte[] Decompress(byte[] data)

{ ///data参数为压缩后的二进制数组

try

{

MemoryStream ms = new MemoryStream(data);

Stream zipStream = null;

zipStream = new GZipStream(ms, CompressionMode.Decompress);

byte[] dc_data = null;

dc_data = EtractBytesFormStream(zipStream, data.Length);

return dc_data;

///返回解压后的二进制数组

}

catch

{

return null;

}

}

/// 将二进制文件反序列化后转化为DataSet

public DataSet GetDatasetFromByte(byte[] ZipByte)

{

byte[] buffer = UnZipClass.Decompress(ZipByte);

BinaryFormatter ser = new BinaryFormatter();

DataSetSurrogate dss;

dss = (DataSetSurrogate)ser.Deserialize(new MemoryStream(buffer));

DataSet DS = dss.ConvertToDataSet();

return DS;

}

常用WebServices返回数据的4种方法比较

以前经常在群里听到朋友们说WebServices的性能特别的慢,说的如何如何。说实话,WebServices的确比调用本地数据要慢一些,可是究竟有多慢,真的如朋友们说的那么难以忍受吗?我个人感觉,多半原因在处理的方式上。让我们亲自编写测试代码,来证明这一切吧。文章由于是我一段时间的总结篇,因此难免参杂个人主观因素,说的不对的地方,还请多多批评。以下我们主要从调用WebServices的方法的特点、应用场景、测试结果三个方面来进行下说明分析。

  1. 直接返回DataSet对象

    特点:直接返回DataSet对象。

    应用场景:1.内网。2.外网且数据量在kb级别时。

2.返回DataSet对象用Binary序列化后的字节数组

特点:字节数组流的处理模式。

应用场景:较大数据交换。

3.返回DataSetSurrogate对象用Binary 序列化后的字节数组

特点:使用微软提供的开源组件进行序列化,依然是字节流的处理模式。详情请参考:http://support.microsoft.com/kb/829740/zh-cn

应用场景: 较大数据交换。

4.返回DataSetSurrogate对象用Binary 序列化并Zip压缩后的字节数组

 特点:使用微软提供的开源组件对字节流数组进行压缩后传递,依然是字节流的处理模式。详情请参考:http://support.microsoft.com/kb/829740/zh-cn 

 应用场景:外网环境需要进行大数据量网络数据传递时,建议采用此种方法。也是笔者强烈向大家推荐使用的一种方法。

WebServices的代码如下:

WebServices

客户端调用WebServices的代码如下:

客户端调用WebServices

测试的结果按照先后顺序如下图所示:

关于测试结果的特殊说明:由于测试环境是在本地,数据量也不是很大,测试的结果离实际情况还不是很接近,如果大家有条件的话,可以测试一下,同时希望把测试的结果提供给大家参考。

最后,为了方便大家,这里还提供了源码下载,下载地址如下:

/Files/wlb/WebServiceSummary.rar

关于源代码的特殊说明:笔者这里的开发环境为VS2008中文版sp1+SQLServer2008sp1。数据库为Northwind数据库。

http://www.cnblogs.com/wlb/archive/2009/04/13/1434419.html

其他:

http://blog.csdn.net/qiujialongjjj/article/details/20033943

webservice中将dataset 压缩的更多相关文章

  1. WebService使用DataSetSurrogate压缩Dataset的序列化和解压反序列化传输 (转)

    转自:http://blog.163.com/hehong0925@126/blog/static/1339333372012102242920521/ 在WebService中将dataset序列化 ...

  2. Ajax调用WebService

    前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...

  3. JQuery请求WebService返回数据的几种处理方式

    打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...

  4. C# 使用GZip对字符串压缩和解压

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  5. Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示

    Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示 在 开发中遇到应用c#及asp.net的在的webservice 保存图片并以xml文件形式现实出来 ...

  6. 关于C#调用WebServices的方法

    2018-1-22 前情是我使用vs在引用高通的webservice时出现了下载错误导致无法引用这个服务,先是在网上查询了这个错误的问题及解决方案,将这个问题与解决方法发给了高通同事,可惜的是他也不清 ...

  7. delphi中midas是什么

    Delphi中MIDAS到底是什么呢?和他相关组件是什么呢?   MIDAS(Multitiered Distributed Application Services)多层分布式应用服务.   Del ...

  8. DB2和Oracle区别

    转 http://blog.chinaunix.net/uid-7374279-id-2057574.html 写在前面:今天客户来访(日本人),问我DB2和Oracle区别.因为不是DBA(勉强的理 ...

  9. gzip优化网络传输量提高传输效率[转]

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;us ...

随机推荐

  1. 密码硬编码(Password Management: Hardcoded Password)

    在对项目进行安全扫描时,发现一些密码硬编码问题,本文主要三个方面:1)什么是密码硬编码:2)密码硬编码的危害:3)密码硬编码的解决方案. 一 什么是密码硬编码 将密码以明文的形式直接写到代码中,就是密 ...

  2. 扩展运算符和rest运算符

    扩展运算符 扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值 一.拆分数组 扩展运算符可以直接把数组拆分成用逗号隔开的值 <template> <sect ...

  3. 【25】session练习

    #用登录练习session html1为首页,html2为登录页面 def session1(request): uname=request.session.get('myname','请登录') # ...

  4. 爬虫,如何防止被ban之策略大集合

    话说在尝试设置download_delay小于1,并且无任何其他防止被ban的策略之后,我终于成功的被ban了. 关于scrapy的使用可参见之前文章: http://blog.csdn.net/u0 ...

  5. mtime、atime、ctime基本解释

    不罗嗦 Access time.Modify time.Change time,也就是访问时间.修改时间和状态时间. >修改时间:文件的内容被最后一次修改的时间,我们经常用的ls -l命令显示出 ...

  6. $2015 武汉森果公司web后端开发实习日记----书写是为了更好的思考

    找暑期实习,3月份分别投了百度和腾讯的实习简历,都止步于笔试,总结的主要原因有两点:基础知识不扎实,缺乏项目经验.后来到拉勾网等网站上寻找实习,看了很多家,都还是处于观望状态.后来参加了武汉实习吧在大 ...

  7. Sourse Insight使用教程及常见的问题解决办法

    1.下载安装 2.创建项目new project(注意不是file-->new ),而是project-->new project,输入项目名称和密码. 3.添加文件,其实就是将你的整个项 ...

  8. 【TopCoder】SRM159 DIV2总结

    250分题:给出一些规则,问街道上哪些地方可以停车. 简单的模拟题,考察每条规则是否成立即可. 代码:StreetParking 500分题:实现集合的交,并和差运算. 交运算:一个数组放到集合中,遍 ...

  9. FreeRtos堆栈检测应用

    Free rtos每个任务都有自己的栈空间,每个任务需要的栈大小也是不同的.如果堆栈过小就会造成栈溢出,有时候栈溢出发生在某种特定顺序的任务切换中,比较难检测出.所以前期测试和监控任务栈用量就显得尤其 ...

  10. Python编程-多进程二

    7.进程间通信(IPC)方式二:管道 (1)创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象 ...