Восстановление массива объектов пользовательского класса из 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/... Это также подлинный способ хранения объектов пользовательских классов в общих объектах

Другие вопросы по тегам