Actionscript SharedObject数据随机丢失

时间:2014-07-30 21:51:24

标签: actionscript-3 dictionary save loading shared-objects

我正在设计具有保存和加载功能的游戏。使用SharedObject技术,我成功地保存了大部分变量。但是,有一个词典有时最终会被定义为" undefined"。这可能是我加载游戏时间的1/3。

这是我的保存功能。它大约每2.秒运行一次。我删除了很多代码行,因为它们不相关(保存其他变量)。跟踪线用于调试目的。每次,也是当上面提到的错误诅咒,这条线路工作。因此,字典不是未定义的#34;此刻。

    private function saveGame():void
    {
        so = SharedObject.getLocal("progress", "/");

        so.data.saved = true;

        so.data.airportDict = airportDict;
        trace(dayCount, so.data.airportDict["Australia"]);  
        so.flush();
    }

每次打开程序时都会运行以下行。目的是确定是否有要加载的已保存文件。

so = SharedObject.getLocal("progress", "/");

if (so.data.saved == true)
{
    loadProgress();
}

else
{
    airportDict = new Dictionary();
    resetAirportDict(); // This function just add lots of data to the dictionary.
}

最后,加载功能:

private function loadProgress():void
{
    so = SharedObject.getLocal("progress", "/");

    airportDict = so.data.airportDict;

    trace("Successfull start? " + airportDict);
}

如前所述,机场词典的价值是"未定义"也许是我运行程序的1/3。没有任何原因。这是一个谜。

1 个答案:

答案 0 :(得分:0)

SharedObject可以存储基本类型+数组和对象类型。对于其他复杂类型,您必须使用registerClassAlias()注册要存储的类。在您的情况下,Dictionary是一种复杂类型,默认情况下不由SharedObject +处理,您可能使用的复杂对象也必须注册。因此,您使用的任何复杂类都必须注册,否则SharedObject将失败。

registerClassAlias("YourClassName", YourClassName);

这段代码产生错误,因为SharedObject不理解复杂的对象:

var shareddata:SharedObject = SharedObject.getLocal("mydata")           
var instance:MyClass;
if(shareddata.data["instance"] == undefined)
{
    instance = new MyClass();
    shareddata.data["instance"] = instance;
}
else
{
    instance = shareddata.data["instance"];         
}

但您可以通过注册课程轻松修复它:

import flash.net.registerClassAlias;

registerClassAlias("MyClass", MyClass);
var shareddata:SharedObject = SharedObject.getLocal("mydata")           
var instance:MyClass;
if(shareddata.data["instance"] == undefined)
{
    instance = new MyClass();
    shareddata.data["instance"] = instance;
}
else
{
    instance = shareddata.data["instance"];
}
//no error and you truly get back your custom class instance the second time around.