WebService使用DataSetSurrogate压缩Dataset的序列化和解压反序列化传输 (转)
转自:http://blog.163.com/hehong0925@126/blog/static/1339333372012102242920521/
在WebService中将dataset序列化是我们经常遇到的问题,但是遇到很大的dataset,则网络传输就必须考虑的问题,将dataset处理压缩后传输是不错的选择。提供这种方法如下:
第一步:引入DataSetSurrogate组件
第二步:压缩序列化
  /// <summary>
         /// 序列化转化为二进制数组的DataSet
         /// </summary>
         /// <param name="DS"></param>
         /// <returns></returns>
         [WebMethod(Description = "序列化转化为二进制数组的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;
         }
         /// <summary>
         /// 压缩二进制文件
         /// </summary>
         /// <param name="data"></param>
         /// <returns></returns>
         public byte[] Compress(byte[] data)
         {
             MemoryStream ms = new MemoryStream();
             Stream zipStream = null;
             zipStream = new GZipStream(ms, CompressionMode.Compress, true);
             //从指定的字节数组中将压缩的字节写入基础流
             zipStream.Write(data, , data.Length);
             zipStream.Close();
             ms.Position = ;
             byte[] compressed_data = new byte[ms.Length];
             ms.Read(compressed_data, , int.Parse(ms.Length.ToString()));
             return compressed_data;
         }
第三步:解压饭序列化
 class UnZipClass
 {
   public static byte[] EtractBytesFormStream(Stream zipStream, int dataBlock)
         {
             try
             {
                 byte[] data = null;
                 ;
                 while (true)
                 {
                     Array.Resize();
                     int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
                     )
                     {
                         break;
                     }
                     totalBytesRead += bytesRead;
                 }
                 Array.Resize(ref data, totalBytesRead);
                 return data;
             }
             catch
             {
                 return null;
             }
         }
         /// <summary>
         /// 将压缩后的二进制数组解压
         /// </summary>
         /// <param name="data">The data.</param>
         /// <returns></returns>
         public static byte[] Decompress(byte[] 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;
             }
         }
  }
        /// <summary>
        ///  将二进制文件反序列化后转化为DataSet
        /// </summary>
        /// <param name="ZipByte"></param>
        /// <returns></returns>
         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;
         }
第四步:服务器调用 GetDataSetSurrogateZipBYtes()方法将DataSet对象转化为字节数组进行传输。客户端调用GetDatasetFromByte()方法将从服务器接收到的字节数组转化为DataSet对象
WebService使用DataSetSurrogate压缩Dataset的序列化和解压反序列化传输 (转)的更多相关文章
- Linux下打包压缩成war包和解压war包
		一. 打包成war包 因为种种原因公司需要把java程序达成war包.起先用zip命令打包,起先可以用,后来却无法使用.今天找到一个更好的办法.用jar命令,前提是要安装jdk. 把当前目录下的所有文 ... 
- CentOS 压缩(打包)和解压
		1.tar命令 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 Gzip压缩或解压 -j 用 bzip2压缩或解压 -v 显示压缩或解压的过程 -f 目标文件名,在 f ... 
- c#对dataset和list集合压缩和解压,能提高访问速度
		public class YS { public static byte[] Decompress(byte[] data) { byte[] bData; MemoryStream ms = new ... 
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
		关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ... 
- C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)
		我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ... 
- Linux压缩和解压汇总
		各种后缀的压缩包压缩方法和解压方法 压缩包 压缩 解压 .tar.gz和.tgz tar -czf jpg.tar.gz *.jpg tar -xzvf filename -C path .tar.b ... 
- java 文件压缩和解压(ZipInputStream, ZipOutputStream)
		最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ... 
- C#实现通过Gzip来对数据进行压缩和解压
		C#实现通过Gzip来对数据进行压缩和解压 internal static byte[] Compress(byte[] data) { using (var compressedStream = n ... 
- Linux下打包压缩war和解压war包
		Linux下打包压缩war和解压war包 unzip是一种方法,如果不行则采用下面的方法 把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建wa ... 
随机推荐
- dojo加载树错误
			1.错误叙述性说明 error loading undefined children. TypeError:this._arrayOfTopLevelItems is undefied. ... 
- 使用 Advanced Installer 打包 一键安装Web应用程序
			原文:使用 Advanced Installer 打包 一键安装Web应用程序 安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置应用程序名称和 ... 
- Java多线程之Lock的使用(转)
			package thread.lock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execut ... 
- 关于在同一母版页中使用多个CSS文件的解决方案
			原文:关于在同一母版页中使用多个CSS文件的解决方案 以前都用.NET1.1没遇到这问题,现在换了2.0开始学着使用母版,结果就遇到了这个问题,在百度上一搜索才发现有不少人提出这个问题,但没找到好的解 ... 
- HDU 2120 Ice_cream's world I(并检查集合)
			职务地址:HDU 2120 这题尽管字数不多,但就是看不懂. . 意思是求最多有多少个被墙围起来的区域.显然就是求环的个数.然后用并查集求环个数就能够了. 代码例如以下: #include <i ... 
- jaxb和dozer简介
			一.jaxb是什么 JAXB是Java Architecture for XML Binding的缩写.可以将一个Java对象转变成为XML格式,反之亦然. 我们把对象与关系数据库之间 ... 
- thinkphp学习笔记10—看不懂的路由规则
			原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ... 
- lucene两个分页操作
			基于lucene两个分页: lucene3.5查询方式(每次查询所有记录,然后取当中部分记录.这样的方式用的最多),lucene官方的解释:因为我们的速度足够快. 处理海量数据时.内存easy内存溢出 ... 
- 开始学习java
			.net 许久 看网络java猿飞计划,感觉成了少数类,学校为它,有多难不,有着vb,C,javascript和vs基金会,这并不是说一些语法和框架的熟悉做,搞两天,以一个开发环境,myeclipse ... 
- hdu-4419-Colourful Rectangle-段树区,并寻求
			这个问题很有趣的项目,写麻烦.它预计将有写了很长的时间. 好在,我想开了一个比较简单的方法.. . 使用位计算,颜色RGB分别1,2,4,代表. 状态的长度了. #include<stdio.h ... 
