zoukankan      html  css  js  c++  java
  • webservice序列化和反序列化(针对网上DataSet优化)

    只列出这四种数据的返回形式:

      (1)直接返回DataSet对象
      (2)返回DataSet对象用Binary序列化后的字节数组
      (3)返回DataSetSurrogate对象用Binary序列化后的 字节数组
      (4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组

    DataSetSurrogate 类为微软在2.0的时候提供的压缩DataSet的类,下载/Files/fujinliang/DataSetSurrogate.rar

    代码如下:

     [WebMethod(Description = "直接返回DataSet对象")]
            public DataSet GetDataSet()
            {
                string connStr = System.Configuration.ConfigurationManager.AppSettings["ConnString"].ToString();
                SqlConnection conn = new SqlConnection(connStr);
                string sql = "select * from Base_Dic";
                conn.Open();
                SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
                DataSet ds = new DataSet("China");
                sda.Fill(ds);
                conn.Close();
                return ds;
            }


            [WebMethod(Description = "直接返回DataSet对象,并用Binary序列化后的字节数组")]
            public byte[] GetDataSetBytes()
            {
                DataSet ds = GetDataSet();
                BinaryFormatter ser = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                ser.Serialize(ms, ds);
                byte[] buffer = ms.ToArray();
                return buffer;
            }

            [WebMethod(Description = "直接返回DataSetSurrogate对象,并且Binary序列化后的字节数组")]
            public byte[] GetDataSetSurrogateBytes()
            {
                DataSet ds = GetDataSet();

                DataSetSurrogate dss = new DataSetSurrogate(ds);
                BinaryFormatter ser = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                ser.Serialize(ms, dss);
                byte[] buffer = ms.ToArray();
                return buffer;
            }

            [WebMethod(Description="直接返回DataSetSurrogate对象,并且binary序列化后并且zip压缩的字节数组")]
            public byte[] GetDataSetSurrogateZipBytes()
            {
                DataSet ds = GetDataSet();
                DataSetSurrogate dss = new DataSetSurrogate(ds);
                BinaryFormatter ser = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                ser.Serialize(ms, dss);
                byte[] buffer = ms.ToArray();
                byte[] bufferZip = ComPress(buffer);
                return bufferZip;
            }


            //压缩方法
            public byte[] ComPress(byte[] data)
            {
                try
                {
                    MemoryStream ms = new MemoryStream();
                    Stream zipStream = null;
                    zipStream = new GZipStream(ms, CompressionMode.Compress, true);
                    zipStream.Write(data, 0, data.Length);  
                    zipStream.Close();
                    ms.Position = 0;
                    byte[] compressed_data = new byte[ms.Length];
                    ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));
                    return compressed_data;
                }
                catch
                {
                    return null;
                }
            }

    上面的代码在网上比较多,经过测试也确实能优化实体的传输,上面测试的数据如下:

      (1)直接返回DataSet对象

               速度为00:00:01.
      (2)返回DataSet对象用Binary序列化后的字节数组

               速度比(1)快,传输的大小为30589
      (3)返回DataSetSurrogate对象用Binary序列化后的 字节数组

             速度比(1)快,传输的大小为12450
      (4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组

         速度比(1)快,传输的大小为4540

    这四种方式第2,3,4的速度差不多,不过我的数据量不大,在数据量大的情况下,这种优势将更新明显,所以建议用(4)种方式来增加实体实例化的性能

    上面的例子只是针对DataSet进行相关的优化,我们知道在webservice中如果直接使用复合类型,将产生大量的wsdl描述信息,这样生成的xml将是很大的,

    为了优化webservice的复合类型,最后还是对其进行序列化传输,序列化传输,使用的类库在客户端和服务端必须一样,必须标志为[Serialization],不然将会报错,上面的DataSetSurrogate必须新建一个类库,在客户端和服务端引用

    对于其他的实体对象,我们也可以通过序列化来实现复合类型

    缺点:webservice为不同的语言之间的调用提供了一个快速便捷的方法,但在跨平台的情况下,因为序列化和反序列化对二进制进行转换的方式不一样,所以此种功能将会受到限制,看具体平台的业务要求而定。

    例子程序:服务端/Files/fujinliang/WebService.rar

    客户端:/Files/fujinliang/WindowsFormsApplication1.rar

  • 相关阅读:
    JPA条件查询时间区间用LocalDateTime的问题
    Java常用的异常类型
    Android 通用流行框架
    html图标插件
    炫酷科技
    使用zxing生成二维码
    八款常见的Android游戏引擎
    opengl es中不同的绘制方式
    Xml序列化去掉命名空间,去掉申明
    win8 app GridView点击子项布局变更
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2542978.html
Copyright © 2011-2022 走看看