はい、ものすごく久しぶりの更新です。
Flexでサーバサイドとの連携を行う場合には、プリミティブ型を使う以外に
Flex側のクラスとサーバサイドのクラスをマッピングさせることがよくあります。
で、このマッピングでちょっとはまってしまったのでメモです。
今回のメモはFlex側のアプリケーションの問題なので、
サーバサイドのアーキテクチャは関係ありません。
(サーバサイドがamfphpでもPyAMFでもBlazeDSでもLSDSでも)
例えばFlex側でこんなクラスhoge.Hoge.asを書いたとします。
package hoge { [RemoteClass(alias = "hoge.Hoge")] public class Hoge { public var name:String; public var value:String; } }そして、サーバサイドにはhoge.Hogeクラスのオブジェクト配列を返すHogeService.getHogeが実装されているとします。
で、サーバサイドのServiceをRemoteObjectとかで呼んで、結果をDataGridに格納するとします。
例えばこんなFlexアプリケーションhogeAppli.mxmlがあるとします。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.rpc.events.ResultEvent; private function getResult(event:ResultEvent):void { dgHoge.dataProvider = event.result; } ]]> </mx:Script> <mx:RemoteObject id="remoteObject" destination="default" source="HogeService" result="{getResult(event)}"/> <mx:VBox x="0" y="0"> <mx:DataGrid id="dgHoge"> <mx:columns> <mx:DataGridColumn headerText="Name" dataField="name"/> <mx:DataGridColumn headerText="Value" dataField="value"/> </mx:columns> </mx:DataGrid> <mx:Button id="btnGetHoge" label="getHoge" click="{remoteObject.getHoge()}"/> </mx:VBox> </mx:Application>
さて、btnGetHogeがクリックされて、HogeServiceのgetHogeが実行された後
getResultメソッドの引数eventのresultに格納されているのは、何のクラスのオブジェクト配列でしょう。
hoge.Hogeクラスが定義されていてマッピングも定義されているのでhoge.Hogeクラスのオブジェクト配列になりそうなものですけど
実際にはObjectクラスのオブジェクト配列になります。
どうしてこういうことになるのかというと、
Flexのソースツリーの中にhoge.Hoge.asが含まれていたとしても
アプリケーション(この場合はhogeAppli.mxml)からhoge.Hogeクラスが参照されない限りは
hoge.Hoge.asはクラスマッピングの対象にならないようです。
FlexBuilderでは、hoge.Hoge.asにシンタックスの間違いがあってコンパイルが通らないようなソースであっても
ビルドが通ってしまいますから、そもそもコンパイルの対象にならないのかもしれませんね。