是否可以在.net?</type>中压缩List <type>

时间:2012-10-09 10:03:31

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

我目前正在运行web-serice,将呼叫返回到我已构建的iPhone客户端。 Web服务以soap的形式返回xml。

我们注意到的是,当我们使用特定功能时,呼叫所需的时间比UX的接受时间长。

以下是一些示例代码和示例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>

我基本上想要的是缩小数据。优选通过某种压缩。

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

我看了gzip,但无法抓住它,因为它适用于溪流。

任何提示和/或指示都将受到高度赞赏。谢谢阅读。

5 个答案:

答案 0 :(得分:1)

TIPS /指针:

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

  2. 查看使用DeflateStream class

  3. 以下是关于string compression / encryption

  4. 的文章

答案 1 :(得分:1)

使用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);
    }   
}

答案 2 :(得分:1)

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

当然,如果您不想丢失xml格式,也可以使用压缩:

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首先在网络服务器上启用压缩功能。这样你就不会担心手动压缩它,并且作为额外的好处,所有内容(除了img)都会被压缩,从而产生更好的体验。

我怀疑它是否会真正解决问题,因为你提到数据变大了。也许想要在客户端上发明一种不同的缓存方案,并在需要时(或在后台)请求delta。

有些事情比较困难,但在我看来会长期帮助你