【问题标题】:Get byte[] from dataset and compress从数据集中获取 byte[] 并压缩
【发布时间】:2011-01-13 21:15:16
【问题描述】:

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

【问题讨论】:

    标签: c# wcf c#-4.0


    【解决方案1】:

    有一个重要的步骤来节省空间:

    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 smaller,而不是 DataContractSerializerNetDataContractSerializer

    【讨论】:

      【解决方案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();
              }
      

      【讨论】:

      • 我们可以使用相同的逻辑来压缩 ADO.NET DataTables 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2020-12-11
      相关资源
      最近更新 更多