2

Flash CS5.5 で Web ゲームを開発しているときに、この奇妙なバグに遭遇しました。

ゲームが起動すると、LSO からプレイヤーの履歴情報が読み込まれます。私は何ヶ月も同じ方法でそれを行ってきましたが、何らかの理由で約10日前に次の行と他の同様の行がChromeとInternet Explorerで例外を引き起こし始めました. これらはすべて、LSO データ オブジェクトからディクショナリをロードすることに関係しています。以前は問題なく機能していたのに、なぜこれが突然問題を引き起こし始めるのか、誰かが知っていますか? 私のコードとコンパイルのセットアップは長い間同じだったので、Chrome または Internet Explorer で何かが変更された可能性はありますか?

起動時に LSO がロードされる

this.lso = SharedObject.getLocal("myLSO");

しかし、この例外が発生します:

ユーザー例外がスローされました: TypeError: エラー #1034: 型強制に失敗しました: Object@1278ad19 を flash.utils.Dictionary に変換できません...

この行が原因でした:

this.game.playerHist.completionData=this.lso.data.playerHistory.completionData;

最終的に機能した解決策は、次のように辞書を複製することでした。

this.game.playerHist.completionData =
    this.clone(this.lso.data.playerHistory.completionData);

この関数を使用すると、元のオブジェクトを (キーを取得することによって) 辞書のように扱うことで基本的に同じことを行いますが、何らかの理由で例外は発生しません。

function clone(original:Object):Dictionary {
    var cloned:Dictionary= new Dictionary();
    for(var key:Object in original) {
        cloned[key]=original[key];
    }
    return cloned;
}

また奇妙なことに、クローン機能なしで辞書をロードすると、IE では問題なく動作し、Chrome では例外が発生するだけでした。2 つのブラウザの違いについて何か考えがある人はいますか、またはこれを説明する方法はありますか?

4

1 に答える 1

0

デフォルトでは、フラッシュは次のタイプのみを SharedObject に格納するように制限されていると思います: Boolean、int、uint、Number、Object、Array

他のデータ型を保存できるようにするには、次のようにエイリアスを登録する必要があります。

flash.net.registerClassAlias('flash.utils.Dictionary', flash.utils.Dictionary);

同様に、ディクショナリでキーとして使用されているオブジェクト タイプも、これが機能するように登録する必要があると思います。

を見る

于 2015-04-30T17:24:33.293 に答える