1

現在、Web サービスを実行しており、構築した 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>

私が基本的に望んでいるのは、データを小さくすることです。できれば何らかの圧縮によって。

iPhone クライアントに返す前に XML のサイズを圧縮することはできますか?

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

まず、Web サーバーで圧縮を有効にします。そうすれば、手動で圧縮する心配がなくなり、追加の利点として、すべてのコンテンツ (img を除く) が圧縮され、全体的なエクスペリエンスが向上します。

ただし、データが大きくなるとおっしゃっていたので、本当に問題が解決するかどうかは疑問です。おそらく、クライアントでキャッシュし、必要に応じて (またはバックグラウンドで) デルタのみを要求する別のスキームを発明するというアイデアです。

私の意見では、何かを行うのは難しいですが、長期的にはあなたを助けるでしょう

于 2012-10-09T10:15:12.247 に答える