各位大侠:小弟我做的是一个CSS结构的项目,现在需要把查询SQL语句放在服务端WebService上执行,然后把查询结果以DataSet的形式返回給客户端,为了节省传输的字节数,现在我考虑用zlib来压缩和解压缩.现在的问题是我在服务端序列化DataSet为二进制流后压缩传输給客戶端,客戶端解压缩后居然与服务端的字节数不同.请问大侠这是什么原因.以下是我的代码.
服务端:   
[WebMethod(Description = "调用Zlib循环获取远程DATASET")]
    public byte[] ZlibReadTable(string sql)
    {
        DataSet ds = new DataSet();
        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
        SqlConnection myConn = new SqlConnection(connectionString);
        SqlDataAdapter myAdapter = new SqlDataAdapter(sql, myConn);
        myConn.Open();
        myAdapter.Fill(ds);
        myConn.Close();
        Stream ms = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, ds);
        Stream msResult = new MemoryStream();
        zlib.ZOutputStream ZOS = new zlib.ZOutputStream(msResult, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
        ms.Position = 0;
        CopyStream(ms, ZOS);
        byte[] buffer = new byte[msResult.Length];
        msResult.Position = 0;
        msResult.Read(buffer, 0, buffer.Length);        ZOS.Close();
        ms.Close();
        msResult.Close();
        return buffer;
    }
    private static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }客戶端:
        private DataSet GetZlibBinaryData(string sql)
        {
            GetDataSet.Service svc = new DSClient.GetDataSet.Service();
            byte[] bb = svc.ZlibReadTable(sql);
            Stream br = new MemoryStream(bb);            Stream ms = new MemoryStream();
            zlib.ZOutputStream ZOS = new zlib.ZOutputStream(ms);
            ZOS.Write(bb, 0, bb.Length);
            br.Position = 0;
            CopyStream(br, ZOS);
            IFormatter bf = new BinaryFormatter();
            ms.Position = 0;
            object obj = bf.Deserialize(ms);
            DataSet ds = (DataSet)obj;
            ms.Close();
            ZOS.Close();
            return ds;
        }
        private static void CopyStream(System.IO.Stream input, System.IO.Stream output)
        {
            byte[] buffer = new byte[2000];
            int len;
            while ((len = input.Read(buffer, 0, 2000)) > 0)
            {
                output.Write(buffer, 0, len);
            }
            output.Flush();
        }
望某位大侠能解救小弟!!!感激不尽.

解决方案 »

  1.   

    没有遇到这种问题嗎?用Zlib把流压缩和解压缩后结果与原来的流字节数不同.
      

  2.   

    /// <summary>
      /// 压缩数据集
      /// </summary>
      /// <param name="ds"></param>
      /// <returns></returns>
      public static byte[] CompressDS(DataSet ds)
      {
       MemoryStream ms = new MemoryStream();
       ZipOutputStream zos = new ZipOutputStream(ms);
       zos.PutNextEntry(new ZipEntry(ds.DataSetName));   
       BinaryFormatter bf = new BinaryFormatter();
       DataSetSurrogate dss = new DataSetSurrogate(ds);
       bf.Serialize(zos, dss);
       zos.CloseEntry();
       zos.Close();
       byte[] ret = ms.ToArray();   
       ms.Close();
       return ret;
      }  /// <summary>
      /// 解压数据集
      /// </summary>
      /// <param name="byt"></param>
      /// <returns></returns>
      public static DataSet DecompressDS(byte[] byt)
      {
       MemoryStream ms = new MemoryStream(byt);
       BinaryFormatter bf = new BinaryFormatter();
       ZipInputStream zis = new ZipInputStream(ms);
       zis.GetNextEntry();   
       DataSetSurrogate dss = (DataSetSurrogate)bf.Deserialize(zis);
       zis.Close();
       ms.Close();
       DataSet ds = dss.ConvertToDataSet();
       return ds; 
      } 建议LZ用GZip,BZip压缩算法结合序列化传输数据,比Zip快
      

  3.   

    是不是因为WebService阿?我以前没用WebService,直接是windows在unix里下载数据文件,再解压,
    没发现有问题。但是上个项目用WebService的时候,会把串行化的字符串中的\r\n变成\n
    这样字符长度就变少了。
    是不是你的WebService也对chr(13)和chr(10)做什么特殊处理?
      

  4.   

    看来Zlib的问题解决不了,不过还是谢谢大家 呵呵!