惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

博客园 - 孜孜

Delphi调用C#web服务参数无法接收的问题 SQL SERVER2005导入导出工具 [转载]TCP的网络编程中一些典型的问题,以及一些分析和解决方案 IIS服务器不支持中文文件名的解决方法 - 孜孜 - 博客园 几条经典的SQL语句 CheckedListBox 用法 SQL中把一个表中的数据导出到一个新表中 为远程IP服务器取个本地认识的主机名 解决DataGridView中回车换行的问题 - 孜孜 - 博客园 Win Form中如何把ENter回车键转换成Tab键 - 孜孜 - 博客园 2003下不能运行asp程序的彻底解决方法 asp.net程序控件显示不正常,HTML编辑器无法显示,表格等页面元素也有异常现象 为本机建立一个映射盘 asp.net2.0中新建Login移动窗体时的奇怪现象 web中打开word为什么老是提示无法打开宏储存? 如何拒绝搜索引擎对站点内文件的访问 如何在优化Web service中的数据? 在asp.net2.0中使用GridView的RenderContro将GridView中数据l转换成EXCEL文件 求出以逗号分隔字段的记录
如何在优化Web service中的数据?
孜孜 · 2006-11-13 · via 博客园 - 孜孜

我也在一点点研究,希望能够抛砖引玉得到大家的意见!

1.DataSet是SOAP序列化对象时最占资源的一个,我们先用二进制序列法尽量减少它的大小。
1)2005中让DataSet不转化XML直接进行二进制序列化:
   
此方法比较简单,将dataSet的RemotingFormat 设置成SerializationFormat.Binary,然后二进制序列化后再压缩就行了。
2)2003中将Dataset直接二进制序列化:
BinaryFormatter用纯二进制的方式序列化DATASET,能使压缩率大大提高,这是台湾作者李匡正 (台灣微軟應用架構技術經理提供的例子里对SQL范例库Northwind的测试结果: 
 SoapFormatter 
 BinaryFormatter 
Dataset 序列化後 Bytes 數 
 1,953,078
 1,448,399 

很显示然BinaryFormatter 明显优于SoapFormatter ,而我也确实用了BinaryFormatter 这种方式实现了提高效率.
再者,用微软提供的DataSetSurrogate 类可以此基础上进一步压缩数据大小,DataSetSurrogate 在.net 2.0里自带。这是比较结果.
  SoapFormatter BinaryFormatter
Dataset 序列化後Bytes數 1,953,078 1,448,399
DataSetSurrogate 序列化後Bytes數 2,371,942 575,684
在这里,有两种方式:可把序列化后的数据用文件形式保存在客户端硬盘;也可用Byte[]方式传回客户端,以下是代码。
web service 端(文件形式)

 [WebMethod(Description="循环获取远程DATASET")]
  
public void SurrogateReadTable(string TableName)
  
{
   
//把DataSet通过Surrogate Class 序列化成 Binary Stream
  
   DataSet ds;
   ds
=SqlHelper.ExecuteDataset(cnn,CommandType.Text,"select * from "+TableName);
   
//实例化DataSetSurrogate,传取出的DATASET到构造函数里
   sds = new DataSetSurrogate(ds); 
   
//实例化二进制流
   BinaryFormatter bf=new BinaryFormatter();
   StreamWriter swDat; 
   
//写到本地一个文件里
   swDat = new StreamWriter(@"c:\output_surrogate_dataset.dat");
   bf.Serialize(swDat.BaseStream, sds);
   
//这里可以知道序列化后的文件的大小
   long size = swDat.BaseStream.Length;
   swDat.Close();
  
  }

客户端

private void button1_Click(object sender, System.EventArgs e)
  
{
   label1.Text
=DateTime.Now.ToString();

   button1.Enabled
=false;
   
//反序列化Binary Stream能通过Surrogate Class转换成 DataSet

   
//从WEB SERVICE上读取方法
   svs.SurrogateRead("t_busdocbase");
   BinaryFormatter bf
=new BinaryFormatter();
   StreamReader swDat; 
   swDat 
= new StreamReader(@"c:\output_surrogate_dataset.dat");
   
object o=bf.Deserialize(swDat.BaseStream);
  DataSet ds;
   sds 
= (DataSetSurrogate) o;
   ds 
= sds.ConvertToDataSet();
   dataGrid1.DataSource
=ds.Tables[0];
   swDat.Close();
   }

web service 端(Byte[]方式)

[WebMethod(Description="获取业务资料远程DATASET")]
      
public byte[] SurrogateRead1()
      
{
       DataSet ds;
       ds
=SqlHelper.ExecuteDataset(cnn,CommandType.Text,"select * from t_busdocbase");
       sds 
= new DataSetSurrogate(ds); 
       MemoryStream s
= new MemoryStream();
       BinaryFormatter bf 
= new BinaryFormatter();
       bf.Serialize(s,sds);
     
       
byte[] e = s.ToArray();
       
return e; 
  
      }

客户端

private void button3_Click(object sender, System.EventArgs e)
   
{
    label1.Text
=DateTime.Now.ToString();

    button3.Enabled
=false;
    
//*反序列化Binary Stream能通过Surrogate Class转换成 DataSet*/

    
//从WEB SERVICE上读取方法


     
byte [] bb=svs.SurrogateRead1();
     MemoryStream br
=new MemoryStream(bb);
     BinaryFormatter bf
=new BinaryFormatter();
     
object o=bf.Deserialize(br);
     sds 
= (DataSetSurrogate) o;
     ds 
= sds.ConvertToDataSet(); 
     dataGrid1.DataSource
=ds.Tables[0];

     br.Close();

    }

2.将对象或长字符压缩后传输
    建议使用Huffman压缩