我有一个名为“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
这个问题是在朋友的一个论坛上提出的,因为没有回复,我认为这是正确的地方...... 别人怎么处理这个?
答案 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/ ...这也是将自定义类对象存储在共享对象中的真正方法