从SharedObject恢复自定义类对象数组

时间:2012-05-28 12:41:34

标签: actionscript-3 lso

我有一个名为“widgetArray”的小部件(我创建的类)数组,我将其保存到共享对象中。

savedGame1.data.widgetArray = widgetArray;

当我去加载这些数据并使用小部件时,我遇到了问题。数组存储正常,但每个小部件都保存为对象。所以我不能简单地做到:

widetArray = savedGame1.data.widgetArray;

因为如果我尝试使用小部件:

widgetArray[0].someWidgetFunction();

它不起作用,因为flash认为它们是对象。我在加载它时尝试对小部件进行类型转换,但它只生成一个空对象。

widgetArray[i] = widgetArray[i] as Widget;//widgetArray[i] becomes null
tempWidget:Widget = widgetArray[i] as Widget;//null as well

这个问题是在朋友的一个论坛上提出的,因为没有回复,我认为这是正确的地方...... 别人怎么处理这个?

2 个答案:

答案 0 :(得分:2)

制作两个可以保存和加载窗口小部件的方法,save方法应该从窗口小部件类中获取数据并将其保存到共享对象中,加载类将从共享对象中获取数据并设置属性对象。

这样的事情:

public function save():Object
{
   return {
      "x":this.x,
      "y":this.y,
      "otherStuff":otherStuff
   };
}

public function load(data:Object):void
{
  this.x = data.x;
  this.y = data.y;
  this.otherStuff = data.otherStuff;
}   

您可以调用save方法并将结果存储在数组中,然后将其存储在共享对象中。您只需要保存重建窗口小部件类所需的数据,而不是保存该类的所有属性。

修改:根据BlueRaja的评论更新。

正如BlueRaja所指出的,IExternalizable意味着用于此目的。

如果您有这样的课程:

public class MyClass implements IExternalizable
{
    private var one:int = 1;
    private var two:int = 2;

    public function MyClass() 
    {
    }

    public function writeExternal(output:IDataOutput):void
    {
        output.writeInt(one);
        output.writeInt(two);
    }

    public function readExternal(input:IDataInput):void
    {
        one = input.readInt();
        two = input.readInt();
    }

    public function print():void
    {
        trace(one);
        trace(two);         
    }
}

然后你可以这样保存:

registerClassAlias("MyClass", MyClass);

var sharedObject:SharedObject = SharedObject.getLocal("so");

var myClass:MyClass = new MyClass();    
sharedObject.data['storedObject'] = myClass;    
sharedObject.flush();

然后加载它:

registerClassAlias("MyClass", MyClass);

var sharedObject:SharedObject = SharedObject.getLocal("so");

var loadedClass:MyClass = sharedObject.data['storedObject'] as MyClass;
loadedClass.print();

希望有所帮助。

答案 1 :(得分:-1)

http://tush.wordpress.com/2007/07/08/actionscript-3-serializing-classes-using-registerclassalias/ ...这也是将自定义类对象存储在共享对象中的真正方法