(13)S2Flex2 ソースコードリーディング3

バイナリのAMFをどうやってjavaオブジェクトに変換しているのか?について
やっぱり前回読み飛ばしていました。

MessageProcessorImpl.process()メソッド内の

final Message requestMessage = requestReadProcess(inputStream);

このrequestReadProcess()メソッド内で、

final MessageReader messageReader = readerFactory
.createMessageReader(inputStream);

↑ここは前回読んだ。

return messageReader.read();

↑ここを読み飛ばした。


はい。

というわけで、今回は、Amf3MessageReaderImpl.read()を読みます。

親クラスreadVersion(),同クラスreadHeader(),readBodies()を順に呼び出しています。

まず、readVersion()メソッド。(AmfMessageReaderImpl)

inputStream.readUnsignedShort();

を実行して、Messageオブジェクトに格納しています。

2バイト分のAMFデータを読み込んでint値として返すメソッドだそうです。
最初の2バイトがバージョン情報だということでしょうか。



次に、readHeader()メソッド。


次の2バイト分のAMFデータを読み込んでいます。

inputStream.readUnsignedShort();

この値がヘッダのカウントとなるようです。

ループ内で、

inputStream.readUTF();

Unicode(UTF-8)文字列で返ってくるメソッド。

inputStream.readBoolean();

1バイト読んで、その値が0かどうかを返すメソッドらしい。

inputStream.readInt();

4バイト分よんでintで返すメソッド。

readData();←親クラスにある

readData()メソッドで、

inputStream.readByte();

1バイト読んでbyteで返すメソッド。
型情報らしい。定義は、AmfTypeDefクラスにて。

AmfDataReaderFactoryImplにて型情報にマッチしたコンポーネントを返す。

コンポーネントのインジェクション by amf3.dicon。

で、AmfMessageReaderImpl.readData()に戻って、

AmfDataReaderのread()を実行。

どのAmfDataReaderかは、先ほどのAmfDataReaderFactoryによって決定されていると。




最後に、readBodies()。

readHeader()と同様にreadData()メソッドを実行して、対応したjavaオブジェクトに変換。

その後、Messageオブジェクトに格納。



AMFからjavaへの変換クラスたちは、

org.seasar.flex2.core.format.amf.io.reader.impl
org.seasar.flex2.core.format.amf3.io.reader.impl
にそれぞれたんまり用意されています。

反対に、javaからAMFへの変換クラス達は、

org.seasar.flex2.core.format.amf.io.writer.impl
org.seasar.flex2.core.format.amf3.io.writer.impl
にそれぞれたんまり。



これで満足しました。ソースコードリーディング終了。

3回に渡って、生放送してはいけないものを放送した気分です。

AMFのデータ構造の全貌は、まだ知らないでいます。

知りたい方はこちらをみてみて下さい。
クラスメソッドさん
OSFlash

やっと次へ進めます。
次回は、ChuraでS2Flex2プロジェクト作成の方法(Eclipse3.1)です。


引用:
flex2.0.1ソース
Java 2 Platform SE 5.0 API