(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();
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