2011-01-13 52 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(); 
     } 
相关问题