孜孜--程序人生

.net/j2me移动应用技术学习与研究

导航

如何在优化Web service中的数据?

Posted on 2006-11-13 17:24  孜孜  阅读(290)  评论(0编辑  收藏  举报

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

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压缩