webservice中将dataset 压缩
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的方法的特点、应用场景、测试结果三个方面来进行下说明分析。
直接返回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 压缩的更多相关文章
- WebService使用DataSetSurrogate压缩Dataset的序列化和解压反序列化传输 (转)
转自:http://blog.163.com/hehong0925@126/blog/static/1339333372012102242920521/ 在WebService中将dataset序列化 ...
- Ajax调用WebService
前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...
- JQuery请求WebService返回数据的几种处理方式
打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...
- C# 使用GZip对字符串压缩和解压
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示
Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示 在 开发中遇到应用c#及asp.net的在的webservice 保存图片并以xml文件形式现实出来 ...
- 关于C#调用WebServices的方法
2018-1-22 前情是我使用vs在引用高通的webservice时出现了下载错误导致无法引用这个服务,先是在网上查询了这个错误的问题及解决方案,将这个问题与解决方法发给了高通同事,可惜的是他也不清 ...
- delphi中midas是什么
Delphi中MIDAS到底是什么呢?和他相关组件是什么呢? MIDAS(Multitiered Distributed Application Services)多层分布式应用服务. Del ...
- DB2和Oracle区别
转 http://blog.chinaunix.net/uid-7374279-id-2057574.html 写在前面:今天客户来访(日本人),问我DB2和Oracle区别.因为不是DBA(勉强的理 ...
- gzip优化网络传输量提高传输效率[转]
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;us ...
随机推荐
- 如何定义 match 常量?
namespace MathConstants { const double E = 2.71828182845904523536; // e const double LOG2E = 1.44269 ...
- How To Surf The Internet In Right Ways
本文偏指导性质,具体实现自行探索~~ 科普 如何***既然想学点东西,就不能被网络束缚住.国内的网络环境,对于外面世界探索还是挺限制的. 什么是墙GFW(great firewall) 中国特有的.就 ...
- 关于python代码是编译执行还是解释执行
Python 是编译型语言还是解释型语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下 ...
- (转)js原生自定义事件的触发dispatchEvent
1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...
- Python基础(9)_生成器(yield表达式形式)、面向过程编程
一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...
- 41和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
- PHP用星号隐藏部份用户名、身份证、IP、手机号、邮箱等实例
一.仿淘宝评论购买记录隐藏部分用户名,以下代码亲测可用. function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') { if( ...
- 015_[小插曲]看黄老师《炼数成金Hadoop应用开发实战案例》笔记
1.大数据金字塔结构 Data Source-->Data Warehouses/Data Marts-->data exploration-->Data Mining-->D ...
- Swing 添加超链接 打开页面
http://lazycat774880994.iteye.com/blog/567412 Swing中打开一个连接或者web页面的一些记录,这几种方式是在项目中有这样子用到过,特来记录一下,以便下 ...
- mybatis collection 一对多关联查询,单边分页的问题总结!
若想直接通过sql实现多级关联查询表结构得有2 个必不可少的字段:id ,parentId,levelId id:主键id, parentId:父id levelId:表示第几级(表本身关联查询的时候 ...