2

我有一个名为“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

这个问题是在一个朋友的论坛中提出的,因为没有回复,我认为这是适合它的地方......其他人如何处理这个问题?

4

2 回答 2

2

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

像这样的东西:

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();

希望有帮助。

于 2012-05-28T13:12:12.480 回答
-1

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

于 2012-06-09T08:39:40.323 回答