Web Service下实现大数据量的传输

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   DataSetSurrogate 在.net 2.0里自带
 在.net1.1下的实现方式实例如下
 在这里,有两种方式:可把序列化后的数据用文件形式保存在客户端硬盘;也可用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();
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值