1

我目前正在运行一个网络服务,将调用返回给我构建的 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>

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

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

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

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

4

5 回答 5

1

提示/指针:

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

  2. 研究使用DeflateStream

  3. 这是一篇关于字符串压缩/加密的文章

于 2012-10-09T10:09:43.293 回答
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);
    }   
}
于 2012-10-09T10:10:17.380 回答
1

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

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

于 2012-10-09T10:21:31.130 回答
0

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

于 2012-10-09T10:11:52.780 回答
0

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

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

一些更难做的事情,但在我看来会长期帮助你

于 2012-10-09T10:15:12.247 回答