如何从sharedObject保存/加载Dictionary

时间:2014-01-13 20:45:32

标签: actionscript-3

我有两个针对词典的问题

第一: 我有一个问题,从Dictionary /加载数据到字典保存数据,我不知道为什么这不工作。我在这里做错了什么???

import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.utils.Dictionary;
import flash.net.SharedObject;

public class Main extends MovieClip
{
    private var _box:Dictionary = new Dictionary  ;
    private var _change:Dictionary = new Dictionary  ;
    private var _loadingItems:Dictionary = new Dictionary  ;

    private var sData:SharedObject = SharedObject.getLocal("octopod_4");

    public function Main()
    {
        if (sData.data.myStorage == undefined)
        {
            trace("1st time this game");
            for (var i:int = 0; i < 5; i++)
            {
                var myImage_mc:MovieClip = new MovieClip();
                _box[i] = myImage_mc;
                if ( i > 1 )
                {
                    _change[myImage_mc] = _box[i - 2];
                }
            }
            sData.data.myStorage = _change;
            sData.flush();
            trace(sData.data.myStorage);


            //we trace what we have in the Dictionary
            for (var key:* in _change)
            {
                trace('_conditions[' + key.name + '] = ' + _change[key].name);
            }
            for (var key:* in _box)
            {
                trace('_box[' + key + '] = ' + _box[key].name);
            }

        }
        else if ( sData.data.myStorage != undefined )
        {
            trace("loaded before");
            _loadingItems = sData.data.myObject;
            trace("_loadingitems " + _loadingItems)
        }
    }
}

第二个问题:如何从 sData.data.myObject; 中提取数据并将其输入到 的 _loadingItems 我的意思是因为错误它给了我错误#2004:其中一个参数无效。我无法看到来自 sData.data.myObject的数据; 被复制到 _loadingItems 。是吗??

1 个答案:

答案 0 :(得分:1)

您将MovieClip放在字典中,除非您为它们实现DisplayObject,否则任何扩展IExternalizable都不能保存在共享对象中。这是因为任何显示对象都具有公共可用的阶段引用,这是动态的,即存储在stage属性中的值是指向内存位置的指针。然后,当您尝试从共享对象加载对象时,默认情况下的行为是将所有属性设置为现在无效的存储值,因为Flash在每次加载影片时占用不同的内存地址集,并且你得到了2004. IExternalizable实现覆盖了自定义代码的默认行为,但是在编写实现时必须遵守某些严格的限制。所以,如果你想在共享对象中存储一些东西,你应该设计一种方法来只存储一些有点静态的元数据(字符串,数字,数组很好,但嵌套对象通常不是,请注意一个对象作为成员数组也是一个嵌套对象,然后根据检索到的元数据创建一组动态对象(显示所有种类的对象)。