• WebService下实现大数据量的传输


          设置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传输的差别尚且如此,通过网络传输的时间优化自然会更明显..

        在2.0 中对数据集序列化和反序列化的方法进行了一下简单的封装,使其可以得到重用的效果.见下面的类DatFormatter.通过GetBinaryFormatData方法可以转换数据集为二进制,在服务器端使用,转换数据集格式。发送,客户端接收,得到二进制格式数据,使用RetrieveDataSet方法,反序列化,得到数据集,进行客户端操作。通过这些简单的操作(序列化和反序列化,将数据压缩),可以使数据集等体积庞大的对象在远程传递中的时间大大减少,并且可以减少网络中断等问题对程序的影响。

    using System;
    using System.IO;
    using System.Data;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace Common
    {
        public class DataFormatter
        {
            private DataFormatter() { }
            /// <summary>
            /// Serialize the Data of dataSet to binary format
            /// </summary>
            /// <param name="dsOriginal"></param>
            /// <returns></returns>
            static public byte[] GetBinaryFormatData(DataSet dsOriginal)
            {
                byte[] binaryDataResult = null;
                MemoryStream memStream = new MemoryStream();
                IFormatter brFormatter = new BinaryFormatter();
                dsOriginal.RemotingFormat = SerializationFormat.Binary;
    
                brFormatter.Serialize(memStream, dsOriginal);
                binaryDataResult = memStream.ToArray();
                memStream.Close();
                memStream.Dispose();
                return binaryDataResult;
            }
            /// <summary>
            /// Retrieve dataSet from data of binary format
            /// </summary>
            /// <param name="binaryData"></param>
            /// <returns></returns>
            static public DataSet RetrieveDataSet(byte[] binaryData)
            { 
                DataSet dataSetResult = null;
                MemoryStream memStream = new MemoryStream(binaryData);
                IFormatter brFormatter = new BinaryFormatter();
    
                object obj = brFormatter.Deserialize(memStream);
                dataSetResult = (DataSet)obj;
                return dataSetResult;
            }
        }
    }

    C#解决办法,已经在例子中实现! 

    WebServices: 
    一个叫:GetBkmlDataStr()的函数,返回XML字符流。 
    ...... 
    return ds.GetXml().ToString(); 

    .net客户端转换成dataset: 
    DataSet ds=new DataSet(); 
    localhost.Service1 ltsr=new localhost.Service1(); 
    ds.ReadXml(new StringReader(ltsr.GetBkmlDataStr(tb_bkdh.Text))); 
    dataGrid1.DataSource = ds.Tables[0]; 

  • 相关阅读:
    初识NuGet
    NHibernate之映射文件配置说
    NHibernate 数据查询之QueryOver<T>
    一、NHibernate配置所支持的属性
    javascript forEach无法break,使用every代替
    missing ) after argument list
    数组分组chunk的一种写法
    call和apply第一个参数为null/undefined,函数this指向全局对象
    apply的理解和数组降维
    javascript push 和 concat 的区别
  • 原文地址:https://www.cnblogs.com/QiuJL/p/4524194.html
Copyright © 2020-2023  润新知