次に示すのは、AMF3 に用意されている 4 種類の単純データ型です。 バイナリのプロトコルでは、それらの各データ型が 1 バイトの型マーカーとして送信されます。 各データ型に対応する XML タグは、括弧で囲んで示します。
<Integer>123456</Integer>
整数データ型は 1 バイトの型マーカーとしてエンコードされ、その後に最大 4 バイトの可変長形式を使用する、エンコードされた整数が続きます。 データ型として使用する以外に、可変長整数はプロトコル内の他の場所で使用されます。
<Double>3.14159</Double>
Double は、バイナリ形式では 1 バイトの型マーカーとしてエンコードされ、その後に 8 バイトの Double 値が続きます。
文字列は、UTF-8 エンコードされた文字列データを格納するために使用します。 データ型として使用する以外に、文字列はクラスやメンバ名などの文字列データを指定するためにも使用されます。 AMF3 データ ストリーム内のすべての文字列値は、AMF3 または XML データの解析時に通常生成される参照テーブルに格納されます。
文字列は文字列値または文字列参照のどちらかとしてエンコードされます。 文字列参照は、文字列参照テーブルに以前出現した文字列の数字を参照します。 この機能は、1 つの AMF3 データ ストリーム内に同じ文字列値が複数含まれている場合に、スペースを節約するために使用されます。
<String>Hello, World!</String>
<String val-refId="#0">This string is referenced</String> <String val-ref="#0"></String>
AMF3 には、XML データをエンコードするためのデータ型が 2 種類用意されています。XMLDocument は、Flash の既存のデータ型を表します。XML はそれよりも新しい XML 型です。 両方のデータ型では、XML は文字列でエンコードされます。 違いは、これらの文字列は文字列参照テーブルに登録されることです。 XML または XMLDocument はオブジェクト参照テーブルに登録されます。
<Xml><Data>some data</Data></Xml> <XmlDoc><Data>some more data</Data></XmlDoc>
スペースを節約するため、XML データは文字列として参照されます。
<Xml refId="data"><Data>foobar</Data></Xml> <Xml ref="data"></Xml>
AMF3 では、日付は UTC タイムゾーンで 1970 年 1 月 1 日 00:00 から経過したミリ秒の数値としてエンコードされます。 ミリ秒の数値は Double としてエンコードされます。 日付では参照もサポートされており、各日付はオブジェクト参照テーブルに登録されます。
<Date>2007-02-18 11:29:00.000</Date> <Date refId="newmillenium">2000-01-01 00:00:00.000</Date> <Date ref="newmillenium"></Date>
AMF3 の配列は、次の 2 種類のデータ型をカバーします。標準配列では、各要素をインデックス番号により特定します。連想配列では、各要素をキーにより特定します (AMF3 の場合、これは常に文字列です)。 配列のバイナリ表現では、配列の連想部が最初にリストされます。 その後に区切り文字 (空文字列) が続き、最後に配列の内容部分 (標準配列要素) が続きます。
XML 表現では、連想配列の要素には name 属性が付きます。 一般的に、配列は特定の型にバインドされません。つまり、配列内にはいかなるデータ型でも格納でき、それぞれのデータ型が異なってもかまいません。
<Array> <Integer name="number1">23</Integer> <Integer name="number2">42</Integer> <String name="username">EMEA\johndoe</String> <Date>2008-02-17 13:47:13.000</Date> <Undefined></Undefined> </Array>
上記の例では、name 属性を持つ 3 つの要素 (つまり、これらは配列の連想部に属しています) と、name 要素を持たない 2 つの要素 (つまり、これらは配列の内容部分に属しています) が配列内にあります。
他のデータ型のように、配列の参照およびそれらの要素の参照は可能です。要素名の参照も可能です。
<Array> <String name="foo" name-refId="#0">bar</String> <String val-ref="#0"></String> </Array>
この例では、2 つの文字列要素を持つ配列があります。 最初の要素の名前は foo で、値は bar です。 2 番目の要素には名前がないですが、文字列参照テーブル ID が #0 である文字列 (文字列 foo) を参照しています。
配列自体はオブジェクト参照テーブルに登録されています。
オブジェクト型は AMF3 で最も強力なデータ型です。 クラスのいくつかのサブタイプについて、知っておく必要があります。 すべてのオブジェクト型で共通していることは、オブジェクト型にはクラス名があるということです。
オブジェクト トレイト
オブジェクトのトレイトはメンバ名に、オブジェクトが動的であるか外部化可能であるかを示す情報を足したものです。
トレイトを持つオブジェクトに含まれるのはメンバ名のリストと、その後に対応するメンバが続きます。 バイナリ形式では、メンバ名は型マーカーのない文字列としてエンコードされます。 メンバ名の数字はフラグの追加フィールドにエンコードされます。このフィールドには、オブジェクトのサブタイプに関する情報も含まれます。 メンバに続いて、動的メンバ (それぞれの前に対応するメンバ名が付きます) のリストがオプションで追加されます。 動的メンバのリストは、動的フラグが True に設定されていて、空文字列で終了する場合にのみ追加されます。
<Object classname="testclass"> <Member>strFirstName</Member> <Member>strSurname</Member> <String>John</String> <String>Doe</String> </Object> <Object classname="testclass2" dynamic="true"> <Integer name="answer">42</Integer> </Object>
オブジェクト参照
オブジェクトはオブジェクト参照テーブルに登録されているため、オブジェクトの直接参照が可能です。
<Object classname="testclass3" dynamic="true" refId="#0"> <Integer name="answer">42</Integer> </Object> <Object ref="#0"></Object>
トレイト参照
サブタイプが オブジェクト トレイトまたは外部化可能トレイトである各オブジェクトは、オブジェクト参照テーブルに追加されずにトレイト参照テーブルに追加されます。 そしてその他のオブジェクトは、それらのオブジェクトのトレイトを参照します。 つまり、そのようなオブジェクトはメンバのリストおよびそれ自体のオブジェクト フラグを備える必要はなく、実際のメンバのみが必要です。
<Object classname="nameclass" traits-refId="name"> <Member>userid</Member> <Member>firstName</Member> <Member>lastName</Member> <String>jdoe</String> <String>John</String> <String>Doe</String> </Object> <Object traits-ref="name"> <String>mmustermann</String> <String>Max</String> <String>Mustermann</String> </Object>
外部化可能トレイト
外部化可能トレイトには、オブジェクトのバイナリ表現、不明な形式でシリアル化された不確定なバイト数が含まれます。 形式は、このデータのシリアル化とシリアル化解除を行うクラスによって異なります。 またクラスは、バイト ストリームから何バイトを消費する必要があるかを知る必要があります。
Silk Performer では、次の最も一般的な 3 つのクラスをサポートしています。
Adobe によると、これらの 3 つが最も一般的なクラスであり、AMF3 としてエンコードされています。 つまり、これらの 3 つのクラスはそれぞれ通常の配列かオブジェクトに解析されます。
これらの 3 つのクラス以外のクラスが見つかった場合、ストリームの最後までのすべてのバイトが拡張化可能トレイトに属すると見なされます。 そのような不明な拡張化可能トレイトの内容は、Base64 エンコードされたデータとして格納されます。
<Object classname="flex.messaging.io.ArrayCollection" externalizable="true"> <Array> <Integer>1</Integer> <Integer>2</Integer> <Integer>3</Integer> <Integer>4</Integer> </Array> </Object> <Object classname="flex.messaging.io.ArrayList" externalizable="true"> <Array> <String>hugo</String> <String>hugo2</String> </Array> </Object> <Object classname="flex.messaging.io.ObjectProxy" externalizable="true"> <Object classname="" dynamic="true"> <String name="ssnum">555-55-5555</String> <String name="name">Tyler</String> <Integer name="age">5</Integer> </Object> </Object> <Object classname="test" externalizable="true">SGVsbG8sIHdvcmxk</Object>
ByteArray には、バイトの配列が保存されます。 XML 表現では、バイナリ データは Base64 形式でエンコードされます。
ByteArray はオブジェクト参照テーブルに登録されます。
<ByteArray>SGVsbG8sIHdvcmxk</ByteArray>
3 つの別個の参照テーブルが使用されます。 次に、どのデータ型がどの参照テーブルに登録されるかに関する概要を示します。
文字列参照テーブル:
オブジェクト参照テーブル:
トレイト参照テーブル:
参照テーブルに登録されないデータ型:
参照 ID は AMF3 パーサーによって生成されます。 ただし、手動で記述した XML ドキュメントではカスタムの参照 ID を使用できます。
<String val-refId="username">EMEA\johndoe</String> <String val-ref="username"></String>