Восстановление массива объектов пользовательского класса из SharedObject
У меня есть массив виджетов (класс, который я создал) под названием "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 ответа
Сделайте два метода, которые могут сохранять и загружать виджет, метод 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();
Надеюсь, это поможет.
http://tush.wordpress.com/2007/07/08/actionscript-3-serializing-classes-using-registerclassalias/... Это также подлинный способ хранения объектов пользовательских классов в общих объектах