2011-01-13 12 views
3

我從WCF操作返回自定義類。使用的綁定是netTcp。這個自定義類包含幾個數據成員。其中之一是一個數據集。數據集可能很大,具體取決於具體操作。我打算將數據集壓縮爲字節,然後返回自定義類。從數據集獲取字節[]並壓縮

基於閱讀我已經拿出以下代碼來從數據集中返回壓縮字節。但不知道這是否是最好的方法(或正確的方法)。你的想法要。 ??

  byte[] bytes = null; 
      byte[] compressedBytes = null; 
      using(var memory = new MemoryStream()) 
      { 
       var formatter = new BinaryFormatter(); 
       formatter.Serialize(memory, ds); 
       bytes = memory.ToArray(); 
      } 

      using(var memory = new MemoryStream()) 
      { 
       using(var gzip = new GZipStream(memory, CompressionMode.Compress, true)) 
       { 
        gzip.Write(bytes, 0, bytes.Length); 
        compressedBytes = memory.ToArray(); 
       } 
      } 

      return compressedBytes;  

回答

4

有節省空間的重要一步:

ds.RemotingFormat = SerializationFormat.Binary; 

否則,它在內部使用XML,甚至通過BinaryFormatter。有了這個,你也可以包含gzip,但是這個增益不是,相當於那麼重要。正如它發生我有一些統計數字來比較這here;該數據複製:

DataTable (xml) (vanilla)    2269ms/6039ms 
             64,150,771 bytes 
DataTable (xml) (gzip)     4881ms/6714ms 
             7,136,821 bytes 
DataTable (xml) (deflate)    4475ms/6351ms 
             7,136,803 bytes 
BinaryFormatter (rf:binary) (vanilla) 2006ms/3366ms 
             11,272,592 bytes 
BinaryFormatter (rf:binary) (gzip)  3332ms/4267ms 
             8,265,057 bytes 
BinaryFormatter (rf:binary) (deflate) 3216ms/4130ms 

但是:DataSet做事非常WCF方式。我會添加標準的OO類和swap the serializer for something like protobuf-net,這是significantly smallerDataContractSerializerNetDataContractSerializer

2

你可以使用下列內容:

 using(var memory = new MemoryStream()) 
     { 
      using(var gzip = new GZipStream(memory, CompressionMode.Compress, true)) 
      { 
       var formatter = new BinaryFormatter(); 
       formatter.Serialize(gzip, ds); 
      } 

      return memory.ToArray(); 
     } 
相關問題