AMF3のAS3 Vector:カーテンを上げる

バージョンFlash Player 10.0から、新しい種類のリスト(ベクター)がサポートされるようになりました。 ベクトルは、型付きの順序付きリストです。 詳細については、アドビのウェブサイトをご覧ください 。 テストでは、単純なアレイに比べて読み取り/書き込み速度が大幅に向上していることが示されています。 (少し前まで、 soulburnerテストを公開しました)。 残念ながら、PHP(およびAS3以外の他の言語)の単一のライブラリは、このデータ型をサポートしていません。



少しグーグル、javaでのベクトルの逆シリアル化について説明した記事が見つかりました。 それほど悪くないことがわかりましたVector.<int>



Vector.<uint>



Vector.<Number>



およびVector.<Object>



4つの追加マーカーがありVector.<uint>



。 ただし、コードを完全に移植することはまだできませんでした。サーバーは、オブジェクトのベクトルを何らかの方法で逆シリアル化できませんでした(数値型ではすべてうまくいきました)。 その結果、xdebugを配置して、「犬が埋葬されている場所」を探し始めなければなりませんでした。 私が疑ったように、その記事の著者は、オブジェクトのベクトルの解析と数値ベクトルのわずかに誤った解析を誤って実装しました。



ベクトル仕様


アドビはAMF3プロトコル仕様をリリースしましが、ベクターの登場後にそれを更新するのを忘れていました(またはしたくありませんでした)。 以下に、ベクターに関する仕様の追加を示します。


 S32 =ビッグエンディアン(ネットワーク)バイト順の符号付き32ビット整数

 vector-type = vector-int-type | ベクトルuint-type | ベクトル番号タイプ|
              ベクトルオブジェクトタイプ| 他のベクトル型

値タイプ= | ベクトル型

 vector-int-marker = 0x0D
 vector-uint-marker = 0x0E
ベクトル番号マーカー= 0x0F
ベクトルオブジェクトマーカー= 0x10

 U29V-len = U29; 最初の(低)ビットは値1のフラグです。
                ; 残りの1〜28の有効ビットは、エンコードに使用されます。
                ; ベクトルの長さ
ベクトル固定フラグ= U8

 vector-int-type = vector-int-marker(U29O-ref | U29V-length vector-fixed-flag *(S32))
 vector-uint-type = vector-uint-marker(U29O-ref | U29V-length vector-fixed-flag *(U32))
ベクトル番号タイプ=ベクトル番号マーカー(U29O-ref | U29V-lengthベクトル固定フラグ*(DOUBLE))
ベクトルオブジェクトタイプ=ベクトルオブジェクトマーカー(U29O-ref | U29V-lengthベクトル固定フラグクラス名
                       *(null-type | object-type))
 vector-other-type = vector-object-marker(U29O-ref | U29V-length vector-fixed-flag UTF-8-empty
                       *(null-type | false-type | true-type | array-type | string-type |
                      ベクトル型| 日付タイプ| バイト配列型))



ご覧のように、4つのマーカーが追加されました。3つは数値専用で、もう1つはその他すべてのものです。



発言。 実際、仕様は完全に真実ではありません。つまり、 vector-other-type



ルールです。
仕様によれば、このようなベクターには、リストされたすべてのタイプを同時に含めることができますが、実際にはリストされたタイプの1つだけです。 また、 null-type



のみを他のタイプと同時に使用できます。
残念ながら、ABNFを使用してこのようなルールを指定する方法はわかりません。



数値ベクトル


それらを使用すると、すべてが簡単です。 ベクトルの長さ、 fixed



フラグ、およびN値( int



uint



またはdouble



)を読み取りuint



。 正直に言うと、これら3つのベクトルがレンダリングされたことに驚きました。特に、文字列とブール値のベクトルがオブジェクトのベクトルとしてエンコードされているという事実を背景にしています(詳細は以下)。



ベクターオブジェクト


数値ベクトルとまったく同じです。 唯一の違いは、追加のパラメーターclass-name



で、ベクターにオブジェクトが含まれるクラスの名前です。 class-name



は空の場合があり、 Object



を意味します。



ベクトル文字列、ブール値、配列、ベクトル


残りの「特殊なタイプ」に対してベクトルがどのようにコード化されているかについて、私は不愉快な驚きを覚えました。 それらは、 class-name



代わりに空の文字列を持つオブジェクトベクトルマーカーを使用します。 したがって、データがなければ、ベクトルに含まれているものを正確に見つけることは不可能です。 空の場合、どのようなベクトルが来たかを知ることは不可能です。



実装


「特別なデータ型」のためのそのようなベクトルのために、PHPのベクトルサポートを実装するのが困難になりました。 問題は正確にベクトルの厳密な型指定です-ベクトルは1つのデータ型しか保存できません。 その後、2つの実装方法の間で引き裂かれました。

-配列用のシンプルだが愚かなコンテナ

-タイプセーフなベクトル

最初のものでは、すべてが簡単ですが、2番目のものが必要です。 その結果、私が働いていた会社を辞めたため、Zend_Amfのパッチは作成されませんでした。 そして今、それを完了する時間はありません。 したがって、私は単に仕様をレイアウトすることにしました。 Zend_Amf、AMFPHP、WebORB、PyAMFなどでベクターサポートを実装することをいとわない人は多いと思います。



PS


仕様は厳密なテストに合格していないため、不完全な場合があります。 どんな修正も喜んでいたします。



All Articles