转自: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的序列化和解压反序列化传输 (转)的更多相关文章

  1. Linux下打包压缩成war包和解压war包

    一. 打包成war包 因为种种原因公司需要把java程序达成war包.起先用zip命令打包,起先可以用,后来却无法使用.今天找到一个更好的办法.用jar命令,前提是要安装jdk. 把当前目录下的所有文 ...

  2. CentOS 压缩(打包)和解压

    1.tar命令 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 Gzip压缩或解压 -j 用 bzip2压缩或解压 -v 显示压缩或解压的过程 -f 目标文件名,在 f ...

  3. c#对dataset和list集合压缩和解压,能提高访问速度

    public class YS { public static byte[] Decompress(byte[] data) { byte[] bData; MemoryStream ms = new ...

  4. 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货

    关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...

  5. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  6. Linux压缩和解压汇总

    各种后缀的压缩包压缩方法和解压方法 压缩包 压缩 解压 .tar.gz和.tgz tar -czf jpg.tar.gz *.jpg tar -xzvf filename -C path .tar.b ...

  7. java 文件压缩和解压(ZipInputStream, ZipOutputStream)

    最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...

  8. C#实现通过Gzip来对数据进行压缩和解压

    C#实现通过Gzip来对数据进行压缩和解压 internal static byte[] Compress(byte[] data) { using (var compressedStream = n ...

  9. Linux下打包压缩war和解压war包

    Linux下打包压缩war和解压war包 unzip是一种方法,如果不行则采用下面的方法 把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c   创建wa ...

随机推荐

  1. Dev GridView RowCellClick活动MouseDown事件

    GridView可编辑.在无声的思想左键点击"进入编辑". 将GridView的OptionsColumn.AllowEdit至false离开时触发RowCellClick. 但有 ...

  2. 体验安装金蝶K/3 Wise 13.0(图像)

    金蝶13.0它提供windows7支持,而数据库也升级到SQL server 2008,有许多功能上的改善和增强.原本在位置低版本号需要时间来管理此功能,因为有这个模块没有原因一直没能起来,现在,新版 ...

  3. Controller 里面就只应该存放这些不能复用的代码(转)

    MVC 的历史 MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写.它表示的是一种常见的客户端软件开发框架 ...

  4. 《R实战》读书笔记三

    第二章  创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括例如以下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 ...

  5. git merge简介(转)

    git merge的基本用法为把一个分支或或某个commit的修改合并现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的帮 ...

  6. RQNOJ PID3 / Jam的计数法

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...

  7. 使用 Eclipse 的 SVN 主要插件创建项目/支/标签

    原文 阅读 Mark Phippard 该博客以及<Subversion 与版本号控制>之后,我了解到 分支/标签 是 SVN 非常棒的特性之中的一个.但我在使用推荐的 "tru ...

  8. hardware_hp刀片服务器安装windows 2008系统配置

    2012年10月26日星期五 第一步. 看刀片机柜的后的OA地址 点击 OK 查看 Actlve OA 例如: 192.168.254.31 l 第二步: 连接PC 到左侧第一个接口 修改本机ip为同 ...

  9. 圣魔大战3(Castle Fantisia)艾伦希亚战记改动器/秘籍——究极改动大法

    艾伦西亚战记== 艾伦希亚战记,是一个游戏 武器:UltraEdit(金山游侠自带的文件改动器也能够,仅仅是这个专业) 目标: 存档文件(建议先备份)  知识:save00.dat-save19.da ...

  10. JavaScript中,关于new的那些事

    这篇文章是自己对new学习过程中的一些理解,有不对的地方希望指出,接受组织的批评教育. 导火线,前段时间学习jQuery的时候,看到源码中有这样一段: jQuery = function(select ...