使用されなくなった AMF3 データ型

単純データ型

注: このトピックは下位互換性のためのみにあります。 使用されなくなった XML シリアル化のメソッドについて説明します。 Java 設定が正しく構成され、Silk Performer バージョン 2009 以降を使用している場合は、このトピックに目を通す必要はありません。 JVM を使用するには、Flex/AMF3 アプリケーション固有のカスタム JAR ファイル (コードを正しい XML 表現にシリアル化するのに必要なクラスを含む) を構成する必要があります。 これらの JAR ファイルがないときは、このトピックで説明する XML シリアル化のメソッドを変換 DLL が使用します。

次に示すのは、AMF3 に用意されている 4 種類の単純データ型です。 バイナリのプロトコルでは、それらの各データ型が 1 バイトの型マーカーとして送信されます。 各データ型に対応する XML タグは、括弧で囲んで示します。

  • Undefined (<Undefined></Undefined>)
  • Null (<Null></Null>)
  • False (<False></False>)
  • True (<True></True>)

Integer

AMF3 の整数は、可変長 29 ビット unsigned integer としてシリアル化されます。 可変長形式では、整数はできるだけ小さいスペースを必要なだけ使用します。 XML 形式では、整数は次のようになります。
<Integer>123456</Integer>

整数データ型は 1 バイトの型マーカーとしてエンコードされ、その後に最大 4 バイトの可変長形式を使用する、エンコードされた整数が続きます。 データ型として使用する以外に、可変長整数はプロトコル内の他の場所で使用されます。

Double

Double には、IEEE 754 で定義されている 8 バイトの倍精度浮動小数点値が格納されます。 これは、多くのプログラミング言語で Double と呼ばれているデータ型です。 XML 形式では、Double は次のようになります。
<Double>3.14159</Double>

Double は、バイナリ形式では 1 バイトの型マーカーとしてエンコードされ、その後に 8 バイトの Double 値が続きます。

String

文字列は、UTF-8 エンコードされた文字列データを格納するために使用します。 データ型として使用する以外に、文字列はクラスやメンバ名などの文字列データを指定するためにも使用されます。 AMF3 データ ストリーム内のすべての文字列値は、AMF3 または XML データの解析時に通常生成される参照テーブルに格納されます。

文字列は文字列値または文字列参照のどちらかとしてエンコードされます。 文字列参照は、文字列参照テーブルに以前出現した文字列の数字を参照します。 この機能は、1 つの AMF3 データ ストリーム内に同じ文字列値が複数含まれている場合に、スペースを節約するために使用されます。

XML 形式では、文字列は次のようになります。
<String>Hello, World!</String>
文字列参照を使用すると、参照される文字列には (属性という形で) 参照 ID が付きます。文字列参照はこの参照 ID を参照します。
<String val-refId="#0">This string is referenced</String>
<String val-ref="#0"></String>

XML および XMLDocument

AMF3 には、XML データをエンコードするためのデータ型が 2 種類用意されています。XMLDocument は、Flash の既存のデータ型を表します。XML はそれよりも新しい XML 型です。 両方のデータ型では、XML は文字列でエンコードされます。 違いは、これらの文字列は文字列参照テーブルに登録されることです。 XML または XMLDocument はオブジェクト参照テーブルに登録されます。

注: XML 形式では、実際の XML コンテンツは XML エンコードされる必要があります。 Silk Performer の XML パーサーには制限があるため、現在は次のようなデータを表記するために XML CDATA を使用できません。
<Xml>&lt;Data&gt;some data&lt;/Data&gt;</Xml>
<XmlDoc>&lt;Data&gt;some more data&lt;/Data&gt;</XmlDoc>

スペースを節約するため、XML データは文字列として参照されます。

<Xml refId="data">&lt;Data&gt;foobar&lt;/Data&gt;</Xml>
<Xml ref="data"></Xml>

Date

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>

Array

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) を参照しています。

配列自体はオブジェクト参照テーブルに登録されています。

Object

オブジェクト型は 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 つのクラスをサポートしています。

  • flex.messaging.io.ArrayCollection
  • flex.messaging.io.ArrayList
  • flex.messaging.io.ObjectProxy

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

ByteArray には、バイトの配列が保存されます。 XML 表現では、バイナリ データは Base64 形式でエンコードされます。

ByteArray はオブジェクト参照テーブルに登録されます。

<ByteArray>SGVsbG8sIHdvcmxk</ByteArray>

参照

3 つの別個の参照テーブルが使用されます。 次に、どのデータ型がどの参照テーブルに登録されるかに関する概要を示します。

文字列参照テーブル:

  • String
  • クラス名 (実際のデータ型ではない)
  • メンバ名 (実際のデータ型ではない)
  • 配列の連想部の要素の値の名前 (実際のデータ型ではない)

オブジェクト参照テーブル:

  • Object
  • Date
  • Array
  • ByteArray
  • XML
  • XMLDocument

トレイト参照テーブル:

  • オブジェクト トレイト
  • 外部化可能トレイト

参照テーブルに登録されないデータ型:

  • Undefined
  • Null
  • False
  • True
  • Integer
  • Double

参照 ID は AMF3 パーサーによって生成されます。 ただし、手動で記述した XML ドキュメントではカスタムの参照 ID を使用できます。

<String val-refId="username">EMEA\johndoe</String>
<String val-ref="username"></String>
注: AMF3 ジェネレータは参照 ID 文字列を使用して参照テーブルの位置を単に検索し、AMF3 での位置をエンコードするだけであるため、XML ドキュメントが XML から AMF3 に転送されてから XML に戻されると、カスタムの参照 ID は失われます。 そのような生成された AMF3 データ ストリームの解析時には、パーサーにはカスタムの参照 ID に関する情報がありません。 パーサーは、# および文字列参照テーブル内の位置を直接反映する連続番号で始まる参照 ID を生成します。