2012-12-12 49 views
0

Flex的共享对象转换数据我只是尝试使用Flex共享对象功能来保存一些数据。数据已成功保存,但是当我找回时,我无法将其转回原始对象。例如,我保存了自定义类的一个对象,当我检索它时,它的类型为Object。虽然我在检查时调试了模式,但它具有我的自定义类的所有成员及其值。但我无法将它从Object类型转换回我的自定义类。从对象到自定义类对象

任何人都可以帮助我吗?

回答

3

可以使用registerClassAlias

registerClassAlias("com.path.to.MyClass", MyClass); 
myStuff = SharedObject.getLocal("myAppStuff"); 
myStuff.data.whatINamedIt = myClassInstance; 
myStuff.flush(); 

现在,当它找回来了......你可以说:

myStuff = SharedObject.getLocal("myAppStuff"); 
var mySavedClass:MyClass = myStuff.data.whatINamedIt as MyClass; 
+0

并非每个对象在这种转换后都是有效的,任何包含内部链接的内容(Sprite/MC的子对象,任何类型的嵌套对象)将作为整体结构无效。如果MyClass只包含静态数据(数字和/或字符串的矢量,但没有可分配的),它应该是没问题的。 – Vesper

+0

恕我直言......如果你在一个SO里面存储一个MC,你做错了什么:)编辑:共享对象应该只用于模型级存储......而且最低限度在那。字符串,整数和布尔值哦,我的。还有更多......你应该重新考虑你正在存储的内容。 –

+0

@Jason Reeves这没有奏效。 当我把它放回去时,它会给出null。 'registerClassAlias( “collections.ObjectMap”,ObjectMap的);' 'VAR shapeMap:ObjectMap的= so.data.shapeMap作为ObjectMap的;' \t \t \t \t'DataRepository.getInstance()shapeMap = shapeMap;' – Saju

1

您自定义的类必须实现IExternalizable的

得到共享对象之前,你必须使用registerClassAlias

 private var so:SharedObject; 

     private function writeMyCustomClass():void 
     { 
      registerClassAlias("classes.MyCustomClass", MyCustomClass); 
      so = SharedObject.getLocal("savedCustom"); 
      so.clear(); 

      var mycustom:MyCustomClass = new MyCustomClass; 
      mycustom.name = "Raja"; 
      mycustom.age = 27; 

      so.data.custom = getAndwriteCustomClassToByteArray(mycustom).readObject(); 
      so.flush(); 
     } 

     private function getAndwriteCustomClassToByteArray(mycustom:MyCustomClass):ByteArray 
     { 
      var copier:ByteArray = new ByteArray(); 
      copier.position=0; 
      copier.writeObject(mycustom); 
      copier.position=0; 

      return copier; 
     } 

     private function getMyCustomClass():void 
     { 
      registerClassAlias("classes.MyCustomClass", MyCustomClass); 
      so = SharedObject.getLocal("savedCustom"); 
      var mycustom:MyCustomClass = so.data.custom; 
     } 





package 
{ 
import flash.utils.IDataInput; 
import flash.utils.IDataOutput; 
import flash.utils.IExternalizable; 
public class MyCustomClass implements IExternalizable 
{ 
    public var name:String; 
    public var age:int; 

    public function MyCustomClass() 
    { 
    } 

    public function writeExternal(output:IDataOutput):void { 
     output.writeObject(this.name); 
     output.writeInt(this.age); 
    } 
    public function readExternal(input:IDataInput):void { 
     this.name=input.readObject(); 
     this.age=input.readInt(); 
    } 
} 

来源:www.actionscript.org

+0

我认为这不是必要的。这只有当你想要私人成员重建时才需要。 –