从数据集中获取byte []并压缩

时间:2011-01-13 21:15:16

标签: c# wcf c#-4.0

我从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;    

2 个答案:

答案 0 :(得分: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-netsignificantly smallerDataContractSerializerNetDataContractSerializer

答案 1 :(得分:3)

您可以使用以下内容:

        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();
        }