なぜRemoteClassがうまくキャストされないのか
先日、久々にBlazeDSで新しいサービスを作成し、それに合わせてJavaのBeanとRemoteClassも新たに作成しました。
ところが、いざ作ってresultをとってみると、一番下の階層のRemoteClassがなぜかObjectに。
階層構造が深すぎるとだめなのかな?と思って、そのオブジェクトだけをやり取りするテストメソッドを作ってみるもダメ。
どうしてキャストされないのだろう?
原因は、FXUGの物知り長者pepeさんのブログを見ることで判明しました。
http://shigeru-nakagaki.com/index.cfm/2007/4/15/20070415-RemoteClass-meta-tag
RemoteClassを登録するためのこの自動生成コードは、プログラムコードの中に変数としての宣言がないと生成されません。
他のRemoteClassのプロパティとして登場するRemoteClassは、通常クラス定義の中で変数として登場するので生成されるはずですが、プロパティがコレクションの場合には、コード内ではRemoteClassの宣言を使用しません。
こういったRemoteClassは自動生成されないのです。
[RemoteClass(alias='HogeChild')] public class HogeChild{ ... } [RemoteClass(alias='HogeParent')] public class HogeParent{ ... //うまくキャストされる public function get child():HogeChild{...} public function set child(val:HogeChild):void{...} //キャストされない(Objectのコレクションになる) public function get children():ArrayCollection{...} public function set children(val:ArrayCollection):void{...} }
これがわかってしまえば、対策は簡単です。
プロジェクトのどこかで、キャストさせたいRemoteClassの変数宣言をするだけでも解消されますし、registerClassAliasをアプリケーション初期化のタイミングで実行してもよいです。
ほっと一安心。