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

  • 相关阅读:
    Linux_9/ RAID & LVM
    Linux_8/ fdisk, xfs_quota, edquota
    Linux_7/(chattr, lsattr), (setfacl, getfacl),su
    Linux_6/ Vim, Shell(下),(at, crond), (SUID, SGID, SBIT)
    Linux_5/ Vim, Shell(上)
    Linux_4/ |, (>, 2>, &>, >>, 2>>)
    Map集合的遍历
    List集合三种遍历方法
    MySQL安装
    排序法
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2542978.html
Copyright © 2011-2022 走看看