5

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

ここでの主な目的は、XML を圧縮して、HttpService の send() メソッドと結果イベントの間の時間をできるだけ短くすることです。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 に正しく書き込まれていないことを意味します。

-- スリ

4

1 に答える 1

2

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

更新deflateストリームではなくbyteArray.uncompress()真のzlibストリームを期待しているという概念をサポートするために、どのドキュメントが必要ですか(つまり、最初の 2 バイトと最後の 4 バイトを切り取った後の zlib ストリーム)?

ByteArrayの Flex 3 ドキュメントには、次の例が示されています。

bytes.uncompress(CompressionAlgorithm.DEFLATE);

しかし、役に立たないことに、デフォルト(もしあれば)が何であるかを述べていません。デフォルトがある場合、それはどこにも明確に文書化されていないため、使用することをお勧めします

bytes.uncompress(CompressionAlgorithm.ZLIB);

自分の意図を明確にするためです。

writeUTFBytesそして、ドキュメントはメソッドではなくメソッドについて語っていwriteUTFます。質問の受信者コードを正確にコピーして貼り付けましたか?

更新 2

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

(1) はい、明示的なinflate()方法があります。ただし、圧縮解除にはアルゴリズム引数があります。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、IMHO) を提供するメリットが何であれ、そこに 2 バイト長のプレフィックスは必要ありません。writeUTF() を使用すると、 uncompress() が bork になることが保証されています。

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

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

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

(1) デバッグを行います。最小限の XML ドキュメントから始めます。表示しrepr(xml_doc)ます。表示しrepr(zlib_compress_output)ます。flex スクリプト (の縮小版) では、最も近い関数/メソッドを使用して、repr()表示することができます:event.resultevent.result.toString()の結果writeUTF*()。zlib.compress() の後に発生する可能性があるすべての影響を理解していることを確認してください。ドキュメントを注意深く読むと役立つ場合があります。

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

HTH、ジョン

于 2009-12-02T04:47:49.740 に答える