5

AMF3 仕様では、いわゆる「参照テーブル」の使用が定義されています (この仕様のセクション 2.2 を参照)。

Erlang で開発した AMF3 エンコーダー/デコーダーでこの動作を実装しましたが、Flash API の経験があまりないため、オブジェクトを AMF3 にシリアル化するときにこれらの参照テーブルを使用するように Flash に強制する方法を簡単に見つけることができません。たとえば、ByteArray を使用すると、完全なオブジェクト エンコーディングが繰り返されるように見えます

 var ba:ByteArray = new ByteArray();
 ba.writeObject("some string1");
 ba.writeObject("some string1");
 # =>
 # <<6,25,115,111,109,101,32,115,116,114,105,110,103,49,
 #   6,25,115,111,109,101,32,115,116,114,105,110,103,49>>

(これは明らかに繰り返しです)。

ただし、これら 2 つの文字列が 1 つの writeObject 呼び出しにある場合、参照を使用しているように見えます。

 ba.writeObject(["some string1", "some string1"]);
 # => <<9,5,1,6,25,115,111,109,101,32,115,116,114,105,110,103,49,6,0>>

ソケットも同じように動作するようです。

では、Flash コードで参照テーブルを使用できますか? ( Flash アプリケーションとサーバーの間に非標準のプロトコルがある場合)

ありがとうございました!

4

3 に答える 3

3

違いは、最初の例では 2 つの文字列リテラルを書いていることだと思います。2 番目の例では、2 つの文字列への参照を持つ配列 (Adobe の仕様では複合オブジェクト) を記述しています。したがって、オブジェクトまたは配列から文字列を参照すると、参照テーブルに書き込まれます。

これは必ずしもそれを強制する方法ではありませんが、フラッシュに組み込まれた AMF シリアライザーがこの方法でオブジェクトをシリアライズすることは論理的であるように思われるため、おそらく、必要な動作 (参照テ​​ーブル文字列) を取得するための信頼できる方法です。

お役に立てば幸いです。

于 2009-03-15T17:06:18.053 に答える
1

AMF3 仕様 ( Adob​​e.com のAMF 3.0 Spec ) の最後の文によると:

また、ByteArray は、readObject および writeObject の呼び出しごとに、オブジェクト、オブジェクトの特性、および文字列の暗黙的な参照テーブルの新しいセットを使用することに注意してください。

ByteArray.writeObject の意図は、オブジェクトごとに保存または復元できるシリアライゼーションを作成することであるようです。

NetConnection オブジェクトの動作は、期待していたものと似ています。

文字列参照テーブルを更新するときは、空の文字列を参照テーブルに追加しないことが重要です。

オブジェクト参照テーブルを維持する場合、次のように防御プログラミングを実装できる場合があります。オブジェクト参照テーブルは再帰的に構築され、特性がまだ完全にはわかっていないオブジェクトが含まれる場合があります。テーブル インデックスが事前に割り当てられていない場合、アプリケーション間で番号付けに一貫性がなくなります。AMF3 デコーダーは、部分的に構築されたオブジェクトからの特性を使用すべきではありません。そのような入力は、エラーとしてフラグを立てる必要があります。

文字列参照テーブルは、メモリ内の文字列オブジェクトがシリアル化されるときに「タグ付け」することにより、エンコーダーで実装されます。同じコンテンツ (一致する文字列) を持つ 2 つの異なる文字列オブジェクトのエンコードは、一方の文字列が他方を参照するようにエンコードされていないようです。両方の文字列が出力され、string-by-reference は使用されません。

元の質問に対する解決策があるかもしれません。すべてが同じクラスに属している多数のオブジェクトがあり、それらのオブジェクトをすべて 1 つのストレージに格納したい場合は、次のことをお勧めします: 格納するすべてのオブジェクトへの参照を含む「親オブジェクト」を作成します。次に、ByteArray.writeObject を使用して、その親オブジェクトを永続化します。AMF は、参照されるすべてのオブジェクトをエンコードし、繰り返されるオブジェクト クラスの特性を効率的な方法で表現します。

于 2009-10-12T22:52:23.480 に答える