网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 软件工程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
本月文章推荐
.实现基于IDEA算法的加密工具(4).
.VS.NET中构建数据库应用程序.
.Ruby程序语言之数字、字符串和其.
.面向服务的架构SOA的推荐方法.
.技术巨人支持新的SOA编程模型.
.跨平台的SOA实施工具BEA AquaLog.
.UML建模工具UMLGraph 4.3 发布.
.我们是否需要软件工程.
.SOA改变的企业软件生态.
.JAVA设计模式之事务处理.
.使用软件工程学来开发软件.
.用Robot实现自动化测试.
.2006拭目以待 SOA标准走向成熟.
.游戏引擎剖析(九).
.SOA Software宣称独立于UDDI注册.
.软件测试概述.
.新上任项目经理遇到的难题.
.统一建模语言(UML)的现状及发展.
.利用UML类图设计Java应用程序详解.
..NET下的动态代码编译探索.

.NET 2.0远程传输数据集的优化方法

发表日期:2008-3-23



  由于当前维护的项目的结构是:Winform + Webservice,所以在数据传输过程中消耗了很多的性能,因此在寻找一种简便实用的优化方法..

  先是用BinaryFormatter序列化数据集,经过WebService传输后,客户端接收到byte[]格式的数据,再反序列化,得到数据集,这种方式,在网络传输时间延迟比较长的情况下效果比较明显,否则,序列化和反序列化再传输二进制的时间甚至超过了直接传送DataSet.所以是否采取这种二进制压缩数据集就没有多大意义了.

  后来找到上面第一篇台湾同胞的文章,才发现在Vs2005的DataSet已经添加了一个RemotingFormat,是采用另外一种方式压缩的,(传说中.net1.1时期开源的DataSetSurrogate类)不过没有找到这个在什么地方下载,试了一下Vs2005里面的,查询12000条记录,设置RemotingFormat = SerializationFormat.Binary;

  再序列化,通过WebService传输,客户端接收,再反序列化,确实效果大大的优于直接传送DataSet,不仅网络传输中如此,即使本机,性能改善也非常明显.

  下面分别是WebService里面的方法和客户端反序列化取DataSet的方法.

  1. 服务器上面取数据,填充数据集,转换为二进制格式.

/**//// <summary>
/// Method for users data query with binaryFormatter
/// </summary>
/// <param name="err"></param>
/// <returns></returns>
public byte[] BinaryUserSelect(ref string err)
{
 ClearCommand();
 m_commandStringBuilder.Append("SELECT * FROM t_Users ;");
 DataSet dsResult = new DataSet();
 byte[] bArrayResult = null;
 try
 {
  dsResult = SqlHelper.ExecuteDataset(m_currentConnectionString, CommandType.Text, m_commandStringBuilder.ToString());
  // 上面都是取数据的,无需关心.二进制压缩数据集是下面一小段
  dsResult.RemotingFormat = SerializationFormat.Binary;
  MemoryStream ms = new MemoryStream();
  IFormatter bf = new BinaryFormatter();
  bf.Serialize(ms, dsResult);
  bArrayResult = ms.ToArray();
  ms.Close();
  //
 }
 catch (Exception ee)
 {
  err = ee.ToString();
 }
 return bArrayResult;
}
  2. 通过WebService把byte[]格式的数据发送到客户端,这里就是WebService自己的事情了,我们无需关心

  3.客户端接收到byte[]格式的数据,对其进行反序列化,得到数据集,进行客户端操作.

/**//// <summary>
/// Get user data with Binary format
/// </summary>
/// <returns></returns>
public DataSet GetBinaryUserData()
{
 string err = "";
 byte[] bUserData = svc.ByteArrayUserSelect(ref err);
 if (err != "")
 {
  MessageBox.Show(err);
  err = "";
  return null;
 }
 // 反序列化的过程
 MemoryStream ms = new MemoryStream(bUserData);
 IFormatter bf = new BinaryFormatter();
 object obj = bf.Deserialize(ms);
 DataSet dsResult = (DataSet)obj;
 //
 ms.Close();
 return dsResult;
}
  同样一台机器,手工生成12000条数据,在本地使用WebService分别读取、传输并在客户端显示数据集和byte[]格式的数据,前者平均时间2.3秒,后者平均时间为1.7秒,之间的差别仅在传输过程的格式,还有后者需要的序列化和反序列化的时间.本地WebService传输的差别尚且如此,通过网络传输的时间优化自然会更明显..

  .net1.1下面微软提供的DataSetSurrogate开发包下载地址:http://support.microsoft.com/default.ASPx?scid=kb;en-us;829740

  对数据集序列化和反序列化的方法进行了一下简单的封装,使其可以得到重用的效果.见下面的类DatFormatter.

  通过GetBinaryFormatData方法可以转换数据集为二进制,在服务器端使用,转换数据集格式。发送,客户端接收,得到二进制格式数据,使用RetrieveDataSet方法,反序列化,得到数据集,进行客户端操作。通过这些简单的操作(序列化和反序列化,将数据压缩),可以使数据集等体积庞大的对象在远程传递中的时间大大减少,并且可以减少网络中断等问题对程序的影响。


1using System;
2using System.IO;
3using System.Data;
4using System.Runtime.Serialization;
5using System.Runtime.Serialization.Formatters.Binary;
6
7namespace Common
8{
9 public class DataFormatter
10 {
11 private DataFormatter() { }
12 /**//// <summary>
13 /// Serialize the Data of dataSet to binary format
14 /// </summary>
15 /// <param name="dsOriginal"></param>
16 /// <returns></returns>
17 static public byte[] GetBinaryFormatData(DataSet dsOriginal)
18 {
19 byte[] binaryDataResult = null;
20 MemoryStream memStream = new MemoryStream();
21 IFormatter brFormatter = new BinaryFormatter();
22 dsOriginal.RemotingFormat = SerializationFormat.Binary;
23
24 brFormatter.Serialize(memStream, dsOriginal);
25 binaryDataResult = memStream.ToArray();
26 memStream.Close();
27 memStream.Dispose();
28 return binaryDataResult;
29 }
30 /**//// <summary>
31 /// Retrieve dataSet from data of binary format
32 /// </summary>
33 /// <param name="binaryData"></param>
34 /// <returns></returns>
35 static public DataSet RetrieveDataSet(byte[] binaryData)
36 {
37 DataSet dataSetResult = null;
38 MemoryStream memStream = new MemoryStream(binaryData);
39 IFormatter brFormatter = new BinaryFormatter();
40
41 object obj = brFormatter.Deserialize(memStream);
42 dataSetResult = (DataSet)obj;
43 return dataSetResult;
44 }
45 }
46}
47

上一篇:数据库设计三大范式应用实例剖析 人气:754
下一篇:Web应用的UML建模与.NET框架开发 人气:719
浏览全部软件工程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐