2011-01-13 3 views
3

WCF操作からカスタムクラスを返す。使用されるバインディングはnetTcpです。このカスタムクラスには、いくつかのデータメンバーが含まれています。それらの1つはデータセットです。特定のアクションによっては、データセットが大きくなることがあります。データセットをバイトに圧縮し、カスタムクラスを返す予定です。データセットからbyte []を取得して圧縮する

私はデータセットから圧縮されたバイトを返すために次のコードを読んでいます。しかし、これが最善の方法(または正しい方法)であるかどうかは分かりません。あなたの思考はpls。 ??

  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; 

それ以外の場合は、内部でさえBinaryFormatterを経由して、XMLを使用しています。これで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クラスを追加し、DataContractSerializerまたはNetDataContractSerializerよりもsignificantly smallerであるswap the serializer for something like protobuf-netを追加します。

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(); 
     } 
関連する問題