2012-05-28 2 views
2

У меня есть массив виджетов (созданный мной класс), называемый «widgetArray», который я сохраняю в общий объект.Восстановление массива объектов класса объектов из SharedObject

savedGame1.data.widgetArray = widgetArray; 

Когда я иду, чтобы загрузить эти данные и использовать виджеты, с которыми сталкиваются проблемы. Массив хранится в порядке, но каждый виджет сохраняется как объект. Поэтому я не могу просто сделать:

widetArray = savedGame1.data.widgetArray; 

, потому что тогда, если я пытаюсь использовать виджеты:

widgetArray[0].someWidgetFunction(); 

это не работает, потому что вспышка думает, что они являются объектами. Я пробовал приписывать виджеты при загрузке, но он создает только нулевой объект.

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

Этот вопрос задается в одном из форумов от друга, так как не было никаких ответов, я думал, что это правильное место для этого ... Как кому-то еще дело с этим?

ответ

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; 
} 

Вы можете вызвать метод сохранения и сохранить результаты в массиве, а затем сохранить его в общем объекте. Вам нужно сохранить данные, необходимые для восстановления класса виджета, а не всех свойств этого класса.

Редактировать: Обновлено на основе комментария 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(); 

Надежда, что помогает.

+0

-1 страшного ответа. Это то, что 'IExternalizable' для * (вам также нужно будет установить' [RemoteClass] 'или вызвать' registerClassAlias ​​() ') * –

+1

Спасибо, что указали это. –

Смежные вопросы