質問

Adobe Flex 3 と Python 2.5 で開発された Web アプリケーションがあります (Google App Engine にデプロイされています)。RESTful Web サービスは Python で作成されており、その結果は現在、HttpService オブジェクトを使用して Flex によって読み取られる XML 形式になっています。

ここでの主な目的は、HttpService send() メソッドと結果イベントの間の時間をできるだけ短くするために XML を圧縮することです。Python ドキュメントを調べ、zlib.compress() を使用して XML 結果を圧縮することができました。

次に、HttpService の結果タイプを「xml」から「text」に設定し、ByteArrays を使用して文字列を XML に解凍してみました。ここで私は失敗しました。私は次のようなことをしています:

var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress();
var xmlResult:XML = byteArray.readUTF();

byteArray.uncompress() で例外がスローされ、byteArray を解凍できないと言われます。また、byteArray の長さをトレースすると 0 になります。

何が間違っているのか理解できません。ご協力をよろしくお願いいたします。

- 編集 -

コード:

# compressing the xml result in Python
print zlib.compress(xmlResult)

# decompresisng it in AS3
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress()

イベントのタイプは ResultEvent です。

エラー:

エラー:エラー #2058:データの解凍中にエラーが発生しました。

このエラーは、byteArray.bytesAvailable = 0 の値が原因である可能性があります。これは、Python が生成した生のバイトが byteArray に適切に書き込まれていないことを意味します。

-- シュリ

役に立ちましたか?

解決

とは byteArray.writeUTF( event.result.toString() ); するべきですか?zlib.compress() の結果は Unicode でも「UTF」でもありません (後ろに数字がないと意味がありません!)。これはバイナリ、別名生のバイトです。デコードしたりエンコードしたり、他の変換を適用したりしないでください。受信側は、zlib.compress() に渡されたデータを回復するために、受信した生のバイトを直ちに解凍する必要があります。

アップデート その考えを裏付ける文書は何ですか? byteArray.uncompress() 真実を期待している ズリブ ストリームではなく しぼむ ストリーム(すなわち、最初の 2 バイトと最後の 4 バイトを切り取った後の zlib ストリーム?

Flex 3 のドキュメント バイト配列 次の例を示します。

bytes.uncompress(CompressionAlgorithm.DEFLATE);

しかし、役に立たないことに、デフォルト(存在する場合)が何であるかについては言及されていません。デフォルトがある場合、それは明白な文書には記載されていないため、使用することをお勧めします。

bytes.uncompress(CompressionAlgorithm.ZLIB);

何を意図しているのかを明確にするためです。

そして、ドキュメントでは次のことが説明されています writeUTFBytes メソッドではなく、 writeUTF 方法。質問に正確な受信機コードをコピー/貼り付けましたか?

アップデート 2

URLをありがとうございます。本物のドキュメントではなく、「ヘルプ」を入手したようです:=(。いくつかのポイント:

(1) はい、明示的なものがあります。 inflate() 方法。ただし、uncompress にはアルゴリズム引数があります。CompressionAlgorithm.ZLIB (デフォルト) または CompressionAlgorithm.DEFLATE ... のいずれかになります。ただし、興味深いことに、後者は Adob​​e Air でのみ利用可能であり、Flash Player では利用できません。少なくとも、uncompress() 呼び出しが正常であることがわかり、生のバイトをネットワーク上に取得し、再び ByteArray インスタンスに取得するという問題に戻ることができます。

(2) さらに重要なことは、両方があるということです。 writeUTF (UTF-8 文字列をバイト ストリームに書き込みます。UTF-8 文字列の長さ (バイト単位) が最初に 16 ビット整数として書き込まれ、その後に文字列の文字を表すバイトが続きます)。 writeUTFBytes (UTF-8 文字列をバイト ストリームに書き込みます。writeUTF() メソッドと似ていますが、writeUTFBytes() は文字列の前に 16 ビット長のワードを付けません。

UTF8 でエンコードされたバイト (nil、私見) を提供するメリットが何であれ、そこに 2 バイト長のプレフィックスを含める必要はありません。 writeUTF() を使用すると、確実に uncompress() が異常終了します。.

ワイヤーに接続する:バイナリ データに対して Python print を使用するのは良いアイデアとは思えません (sys.stdout が raw モードで実行できるように設定されていない限り、コードには示されていません)。

同様に、event.result.toString() を実行して文字列を取得します (Python の Unicode オブジェクトと同様、はい/いいえ?) -- 何を使用して、それを UTF-8 でエンコードすることは、かなり機能しそうにありません。

私は今日までフレックスの存在を知らなかったので、効果的にお手伝いすることはできません。より柔軟な知識を持つ人がすぐに現れない場合に備えて、自給自足に向けたさらなる提案をいくつか示します。

(1) デバッグを実行します。最小限の XML ドキュメントから始めます。見せる repr(xml_doc). 。見せる repr(zlib_compress_output). 。フレックス スクリプト (の短縮バージョン) で、最も近い関数/メソッドを使用します。 repr() 以下を示すことができます。 event.result, event.result.toString() そしてその結果は writeUTF*(). 。zlib.compress() の後に起こる可能性のあるすべての影響を必ず理解してください。ドキュメントを注意深く読んでください。

(2)event.result から生のバイトを取得する方法を見てください。

HTH、ジョン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top