选择显示字体大小

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


  由于当前维护的项目的结构是: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


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons