.Net 1.X平台的Web Service (WS) 数据流压缩方案

  由于目前有些平台仍是在.Net 1.X上面,虽然GZipStream可以压缩数据流,但它必需在.Net 2.0以上的平台才能用,但也不代表.Net 1.X就只能乖乖的认命,接受这个结果,其实在.Net 1.X上,也有一个方法可以做到数据流的压缩,微软有提供一个对象DataSetSurrogate来协助开发人员不用花太多的时间在Coding上,就可以达成目标.

  

  仔细去看DataSetSurrogate的源代码后,大至上就可以了解到它是怎么去"简化"数据量,怎么运用多个Array List及HashTable去保存DataSet里的数据,虽然压缩率没有GZipStream来的高,但也算很优了,而运用也相当的简单,不用写太多的程序在上面,以下就是程序部分的简介 :

  首先,要去下载DataSetSurrogate的这个文件,下载解压后,可以看到VB及CSharp的目录,这两个目录都一样,只是一个是用VB写的,另一个是C#,而这目录以下,有三个目录 : DataSetSurrogate,DSServer,TestSurrogate.而TestSurrogate为测试的项目,DSServer是测试项目的DataAcess的部分,除了要测试,不然可以不用管它,因为我们要用的是DataSetSurrogate,刚解压是没有编译过的,所以要先Complier这个项目,才能得到我们要用的DLL对象.

当我们得到DataSetSurrogate这个对象后,就可以拿到我们的项目里用,当然,不论是Client还是Server,都要记得先将DataSetSurrogate加入参考才能用,以下就是程序范例 :

Server Side :

using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

        [WebMethod]
        public byte[] GetDSBinary()
        {
            try
            {
                DataSetSurrogate dss=new DataSetSurrogate(LoadData().Copy());
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms=new MemoryStream();
                bf.Serialize(ms,dss);
                return ms.GetBuffer();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        private DataSet LoadData()

        {

            try
            {
                DataSet ds=new DataSet();

                //从数据库取得数据

                return ds;

            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

Server端的Web Service就只有这样,就可以了,所以程序部分,真的很少. 而Client端的部分,也是一样,并不多.

Client Side :

using System.Runtime.Serialization.Formatters.Binary;
//using 刚刚做好的WebService

        private void button1_Click(object sender, System.EventArgs e)
        {
            WS.Service1 w=new WSGet.WS.Service1();//new 刚刚的WebService
            try
            {
                dataGrid1.DataSource=null;
                this.Cursor=Cursors.WaitCursor;
                byte[] bt=w.GetDSBinary();

                MemoryStream ms=new MemoryStream(bt);

                BinaryFormatter bf=new BinaryFormatter();
                object obj=bf.Deserialize(ms);
                DataSetSurrogate dss=(DataSetSurrogate)obj;
                dataGrid1.DataSource=dss.ConvertToDataSet().Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.Cursor=Cursors.Default;
            }
        }
?

Client端这样也就OK了,测试了一下压缩量的差异,结果如下表 :

? 压缩前 压缩后 压缩比
GZipStream 18,368,067 bytes 4,445,278? bytes 75%
DataSetSurrogate 6,563,150 bytes 2,872,540 bytes 45%

虽然有20%的差异,但也是不错了,不知道GZipStream+Serialize+DataSetSurrogate会是什么样的结果~(预计效果可能不大,依据微软的说法,.Net 2.0的BinaryFormatter已将DataSet的内容以精简化之二进位制格式化,所以不需再用DataSetSurrogate)

  之所以会去翻出.Net 1.X的旧平台解决方案,主要也是因为现在公司的Client端部分仍是.Net1.X,无法在2.0上运行,虽然Server端是2.0的,也是无法使用GZipStream,但说到这里,有一个重点出现了,我尝试过用DataSetSurrogate放在.Net2.0的执行,从2.0的Server端丢回到1.X的Client端,结果会跳出错误消息"可能原因为版本不相符。类型 System.Globalization.CompareInfo 有 2 个成员,但还原序列化后的成员数目却为 3。".把Server设为1.X就OK了,初步判断,应该是BinaryFormatter的问题,因为.Net1.X与2.0的不同,如上所述"Net 2.0的BinaryFormatter已将DataSet的内容以精简化之二进位制格式化",而1.X的并没有,所以可能因此,在这部分上,造成我在Deserialize时,会发生错误,这个问题目前还没解决,就看看大家有没有答案啰.

参考数据 :

ADO.NET 1.x Dataset 序列化问题探讨

增进数据集序列化和远端性能

下载 : DataSetSurrogate

原文:大专栏  .Net 1.X平台的Web Service (WS) 数据流压缩方案

原文地址:https://www.cnblogs.com/chinatrump/p/11458295.html

时间: 2024-11-08 18:21:13

.Net 1.X平台的Web Service (WS) 数据流压缩方案的相关文章

Web Service(1.8)

“基于 XMLWeb Service 的 Java API”(JAX-WS)通过使用注释来指定与 Web Service 实现相关联的元数据以及简化 Web Service 的开发.注释描述如何将服务器端的服务实现作为 Web Service 来访问或者客户端的 Java 类如何访问 Web Service. JAX-WS 编程标准支持将具有用于定义服务端点应用程序的元数据的 Java 类作为 Web Service 来注释以及注释客户机可以如何访问 Web Service.JAX-WS 支持使

使用XFire+Spring构建Web Service

XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用. 相 对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者.并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用. XFire与Axis2相比具有如下特征: l      

什么情况下应该使用Web Service?

现在我将列举三种情况,在这三种情况下,你将会发现使用Web service会带来极大的好处.此后,我还会举出不应该使用Web service的一些情况. 跨越防火墙的通信 如果你的应用程序有成千上万的用户,而且他们都分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题.那是因为客户端和服务器之间通常都会 有防火墙或者代理服务器.在这种情况下,你想使用DCOM就不是那么简单了,而且,通常你也不愿意把你的客户端程序发布到如此庞大数量的每一个用户手中. 于是,你最终选择了用浏览器作为客户端,

Android开发之使用Web Service进行网络编程

使用Web Service进行网络编程 Android应用通常都是执行在手机平台上.手机系统的硬件资源是有限的,无论是存储能力还是计算能力都有限.在Android系统上开发.执行一些单用户.小型应用是可能的, 但对于须要进行大量的数据处理.复杂计算的应用.还是仅仅能部署在远程server上,Android应用将仅仅是充当这些应用的client. 为了让Android应用与远程server之间进行交互,能够借助子Java的RMI技术,但这要求远程server程序必须採用Java实现:也能够借助于C

Servlet和Web Service的区别

在最开始学习Web Service时候,总觉得Web Service和Servlet没有什么区别,觉得Servlet可以对Http请求进行相应并返回数据, 而Web Service只不过是基于SOAP协议和XML对数据进行封装了,也是采用Http协议来传输数据,后来通过慢慢阅读相关材料,加上实际操作,才发现Web Service和Servlet有很大区别,根本不是在一个层次上的东西,于是对于它们的区别进行总结 1. 整体概念 Servlet是Java对于Web开发而产生的一项技术,可以说Serv

Web Service和Servlet的区别

没接触过web service今天看了一篇文章转过来. 在最开始学习Web Service时候,总觉得Web Service和Servlet没有什么区别,觉得Servlet可以对Http请求进行相应并返回数据,而Web Service只不过是基于SOAP协议和XML对数据进行封装了,也是采用Http协议来传输数据,后来通过慢慢阅读相关材料,加上实际操作,才发现Web Service和Servlet有很大区别,根本不是在一个层次上的东西,于是对于它们的区别进行总结. 1. 整体概念 Servlet

Web Service平台概述

Web  Service平台主要涉及的技术有SOAP(Simple  Object  Access  Protocal,简单对象访问协议), WSDL(Web  Service  Description  Language, Web  Service描述语言),  UDDI(Universal  Description  and  Integration ,统一描述.发现和整合协议). 一.SOAP(简单对象访问协议) SOAP(Simple  Object  Access  Protocal,

译-Web Service剖析: 使用XML, SOAP 和WSDL 进行独立于平台的数据交换

Most applications are developed to interact with users; the user enters or searches for data through an interface and the application then responds to the user's input. A Web service does more or less the same thing except that a Web service applicat

在GlassFish应用服务器上创建并运行你的第一个Restful Web Service【翻译】

前言 本人一直开发Android应用,目前Android就业形势恶劣,甚至会一路下滑,因此决定学习服务器开发.采用的语言是java,IDE是Intellij,在下载Intellij的同时看到官网很多优秀的guide文章,于是按照guide成功完成了一个RESTful的demo.官方文档非常简洁,给我带来了很大的帮助,于是翻译之,希望对其他不愿意看原文的人有所帮助.由于水平有限,读者发现错误请指正,谢谢. 原文地址: https://www.jetbrains.com/help/idea/2016