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. Linux下修改密码复杂度

    在linux,设置密码复杂度的方法有几个1. 一个是在/etc/login.defs文件,里面几个选项PASS_MAX_DAYS 90 #密码最长过期天数PASS_MIN_DAYS 80 #密码最小过 ...

  2. RecyclerView添加分割线

    mRecyclerView = findView(R.id.id_recyclerview); //设置布局管理器 mRecyclerView.setLayoutManager(layout); // ...

  3. 003-Spring 中的StreamUtils

    一.概述 StreamUtils是spring中用于处理流的类,是java.io包中inputStream和outputStream,不是java8中Steam.使用时仅依赖spring-core 二 ...

  4. Oracle学习笔记—常用函数

    这里记录一些oracle常用的函数. TO_NUMBER()函数 将字符串类型转换成一个 number 类型的值. SELECT TO_NUMBER('100.00') FROM DUAL; TO_C ...

  5. What's the difference between 'Even if' and 'Even though'?

    为一个英语词组语法写一篇Blog: even if 与 even though 这两个词组大致意思相当,但强调的侧重有所不同. even if与even though的区别: even if一般引导的 ...

  6. vlc做转发的命令

    from:http://blog.csdn.net/linyuejiang/article/details/7498482 将一个udp的多播流转发复制到http流中去 vlc udp://@239. ...

  7. python基础深入(元组、字符串、列表、字典)

    python基础深入(元组.字符串.列表.字典) 一.列表 1.追加 >>>list = [1,2,3,4] #用于在列表末尾添加新的对象,只能单个添加,该方法无返回值,但是会修改原 ...

  8. hadoop04---shell

    Linux上的mysql安装之后卸载是卸载不干净的,ping服务器ping不通就是把icmp协议关闭了,ping使用的是icmp协议. Export是全局变量,所有用户登录进来都可以使用. 1.ipt ...

  9. 阿拉伯数字转中文大写数字的JS

    function intToChinese ( str ) { str = str+''; var len = str.length-1; var idxs = ['','十','百','千','万' ...

  10. Go Redis 开发

    redigo库来实现redis的操作:https://github.com/gomodule/redigo Redis常用操作 示例代码: package main import ( "gi ...