Продолжу тему затронутую Александром Гаховым в статье Клонирование объектов утилитой ObjectUtil.copy.
Здесь я приведу пример использования registerClassAlias для восстановления объектов определенного класса из SharedObject. Суть проблемы заключалась в том, что помещенные в SharedObject экземпляры определенного класса при перезапуске возвращались, как экземпляры класса Object. Когда я столкнулась с этой проблемой, доступного для понимания примера мне нагуглить не удалось. Перед размещением же поста, я нашла вопрос по этой теме в ruFlex, однако приведенный там пример показался мне не вполне наглядным. Предлагаю вашему вниманию свой пример решения этой проблемы:
XML:
<mx:Application creationComplete="onCreationComplete()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> | |
<mx:Script> | |
<![CDATA[ | |
import src.DataObject; | |
import flash.net.*; | |
| |
private var so: SharedObject; | |
private var dataObject: DataObject; | |
| |
| |
private function onCreationComplete(): void | |
{ | |
dataObject=new DataObject(); | |
registerClassAlias('src.DataObject', DataObject); | |
so = SharedObject.getLocal("test"); | |
} | |
| |
| |
private function dataObjectGeneration(): void | |
{ | |
dataObject.generate(); | |
ta.htmlText+='GENERATION: '+dataObject.toString()+'\n'; | |
} | |
| |
private function saveLocalData(): void | |
{ | |
so.data.DataObject=dataObject; | |
so.flush(); | |
ta.htmlText+='SAVE: '+dataObject.toString()+'\n'; | |
} | |
| |
| |
| |
private function loadLocalData(): void | |
{ | |
so = SharedObject.getLocal('test'); | |
if(so.data.DataObject!=null) | |
{ | |
dataObject=so.data.DataObject as DataObject; | |
ta.htmlText+='LOAD: '+dataObject.toString()+'\n'; | |
} else { | |
ta.htmlText+='LOAD: null\n'; | |
} | |
} | |
| |
]]> | |
</mx:Script> | |
<mx:Button x="193" y="27" label="save" id="save_" click="{saveLocalData()}"/> | |
<mx:Button x="107" y="27" label="generate" id="generate" click="{dataObjectGeneration()}"/> | |
<mx:Button x="49" y="27" label="load" id="load_" click="{loadLocalData()}"/> | |
<mx:TextArea x="49" y="57" height="141" width="618" id="ta"/> | |
</mx:Application> |
Собственно сам класс нашего объекта.
- ackage src
- {
- import mx.formatters.DateFormatter;
- public class DataObject
- {
- public var date: Date;
- public var random: String;
- public function DataObject()
- {
- }
- public function generate(): void
- {
- date=new Date();
- random=""+Math.random()*10000;
- }
- public function toString():String
- {
- var df: DateFormatter=new DateFormatter();
- df.formatString="JJ:NN:SS DD/MM/YYYY";
- return "\n date: "+df.format(date)+"\n random: "+random;
- }
- }
- }
Прошу прощения за подобное отображение mxml-ины. Если пример вас заинтересует скопируйте его. ![]()
