2

在 Flash CS5.5 中开发网页游戏时遇到了这个奇怪的错误

当游戏启动时,它会从 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 中引发异常。有谁知道这两种浏览器之间可能有什么区别,或者有什么办法解释这一点?

4

1 回答 1

0

我认为默认情况下,flash 仅限于在 SharedObject 中存储以下类型:Boolean、int、uint、Number、Object、Array

要允许它存储其他数据类型,您必须像这样注册一个别名:

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

同样,我假设在您的 Dictionary 中用作键的对象类型也必须注册才能正常工作。

查看示例

于 2015-04-30T17:24:33.293 回答