2012年3月1日木曜日

モバイルFlashではregisterClassAlias()が使えない?

モバイルFlash開発で、カスタムクラス型をSharedObjectに保存しようとして以前のようにregisterClassAlias()を使うも、どうしてもnullになる。

琴線探査: FlexでSharedObjectにカスタムクラス型を保存するには?

カスタムクラスはpublicなStringのプロパティーを2つ持っているだけ。getterもsetterもfunctionも無し。

package {
  public class TestClass {
    public var name:String;
    public var url:String;
    public function TestClass() {
    }
  }
}

テストプログラムも超簡単。ApplicationCompleteのイベントのところでこのようにした。

protected function onApplicationComplete():void {
    var so:SharedObject = SharedObject.getLocal("TestApp");
    registerClassAlias("TestClass", TestClass);
    var isWrite:Boolean = true;
    if (isWrite) {
        trace("onApplicationComplete() write!");
        var tcWrite:TestClass = new TestClass();
        tcWrite.name = "jun";
        tcWrite.url = "koro";
        so.data.tmp = tcWrite;
        so.flush();
    } else {  
        trace("onApplicationComplete() read!");
        var tcObj:Object = so.data.tmp;
        var tcRead:TestClass = so.data.tmp as TestClass;
        trace("tcObj.name=" + tcObj.name + " tcRead=" + tcRead);
    }
}

書き込んだすぐに読み込むとテストにならないので、初回起動時はisWriteをtrueにして、次に起動する時にisWriteをfalseにする。

このようにして2回目に起動した時のトレースはこうだ。

tcObj.name=jun tcRead=null

Object型のままの場合はname値が取得できているので、正しくデータが書きこまれていることはわかる。しかし、TestClass型にキャストしたものはnull。

オレってば、何か間違ってる?

そうでないとすると、モバイルFlashではregisterClassAlias()が機能しないのかもしれない・・・