由于当前维护的项目的结构是: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; } |
| /**//// <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; } |
| 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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器