【问题标题】:Is it possible to compress a List<Type> in .net?是否可以在 .net 中压缩 List<Type> ?
【发布时间】:2012-10-09 10:03:31
【问题描述】:

我目前正在运行一个网络服务,将调用返回到我构建的 iPhone 客户端。 Web 服务以肥皂的形式返回 xml。

我们注意到,当我们使用特定功能时,就用户体验而言,调用所需的时间比接受的时间长。

这是一些示例代码和示例 xml

功能

public List<Foo> bar(....)
{

    // stuff


    return Bar;  
}

结果被序列化为 XML 并在 iPhone 客户端中使用。

函数返回的 XML 示例。(此 xml 可能会变得非常大,具体取决于用户使用客户端应用程序的方式)。

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <response xmlns="uri:Foo">
      <result>
        <p>
          <num>string</num>
          <d>int</d>
          <pf>string</pf>
          <pt>string</pt>
          <ipk>boolean</ipk>
          <ipa>boolean</ipa>
          <va>
            <ava xsi:nil="true" />
            <ava xsi:nil="true" />
          </va>
          <dps>
            <dp xsi:nil="true" />
            <dp xsi:nil="true" />
          </dps>
          <dst>string</dst>
        </p>
      </result>
    </response>
  </soap:Body>
</soap:Envelope>

我基本上想要的是使数据更小。最好通过某种压缩。

是否可以在返回给 iPhone 客户端之前压缩 XML 的大小?

我查看了gzip,但无法真正掌握它,因为它适用于流。

任何提示和/或指针将不胜感激。谢谢阅读。

【问题讨论】:

    标签: c# web-services xml-parsing compression gzip


    【解决方案1】:

    如果您可以交换序列化,我会研究这个主题: Fast and compact object serialization in .NET

    当然如果不想松动xml格式也可以使用压缩:

    【讨论】:

      【解决方案2】:

      提示/指针:

      1. 如果可能,考虑使用 JSON,它占用的空间更小。

      2. 研究使用DeflateStream

      3. 这是string compression / encryption上的一篇文章

      【讨论】:

        【解决方案3】:

        使用DeflateStream 怎么样?这样,您可以将数据作为压缩字节数组而不是 XML 返回。我使用这种方法将 XML 段保存在内存中以减少占用空间,并且它减少了大约 80% 的整体大小,例如

        在服务器上压缩

        using (var stream = new MemoryStream())
        {
            using (var zip = new DeflateStream(stream, CompressionMode.Compress, true))
            {
                xmlDoc.Save(zip, SaveOptions.DisableFormatting);
            }
            return stream.ToArray();
        }
        

        在客户端解压

        using (var stream = new MemoryStream(compressedBytes))
        {
            using (var zip = new DeflateStream(stream, CompressionMode.Decompress))
            {
                return XDocument.Load(zip);
            }   
        }
        

        【讨论】:

          【解决方案4】:

          如果您使用的是 WCF 4.5 或更高版本,则可以在二进制编码器上使用压缩: http://msdn.microsoft.com/en-us/library/aa751889.aspx

          【讨论】:

            【解决方案5】:

            在网络服务器上启用压缩作为开始。这样您就不必担心手动压缩它,并且作为额外的好处,所有内容(除了 img 的)都将被压缩,从而获得更好的整体体验。

            我怀疑它是否真的能解决问题,因为您提到数据会变得很大。也许一个想法是发明一种不同的方案,在客户端缓存并在需要时(或在后台)请求增量。

            一些更难做的事情,但我认为从长远来看会对你有所帮助

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多