少しグーグル、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
仕様は厳密なテストに合格していないため、不完全な場合があります。 どんな修正も喜んでいたします。