【问题标题】:Flex SharedObject Casting data from Object to Custom Class ObjectFlex SharedObject 将数据从对象转换为自定义类对象
【发布时间】:2012-12-12 03:35:48
【问题描述】:

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: actionscript-3 apache-flex casting browser-cache


    【解决方案1】:

    你可以使用 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;
    

    【讨论】:

    • 不是每个对象在这样的转换后都是有效的,任何包含内部链接的东西(Sprites/MCs 的子对象,任何类型的嵌套对象)都将作为一个整体结构无效。如果 MyClass 仅包含静态数据(数字和/或字符串的向量,但没有可分配的内容),应该没问题。
    • 恕我直言...如果您将 mc 存储在 SO 中,那么您做错了:) 编辑:共享对象应仅用于模型级存储...并且最少。字符串、整数和布尔值哦,天哪。还有更多...您应该重新考虑您要存储的内容。
    • @Jason Reeves 这没有用。当我把它扔回去时,它给出了null。 registerClassAlias("collections.ObjectMap",ObjectMap);var shapeMap:ObjectMap = so.data.shapeMap as ObjectMap;DataRepository.getInstance().shapeMap = shapeMap;
    • 你能粘贴你的代码吗? registerClassAlias 确实有效...我一直使用它来做这件事。
    • 请记住,您需要注册所有涉及的类,甚至是用于 MyClass 的成员变量的类。
    【解决方案2】:

    你的自定义类必须实现 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

    【讨论】:

    • 我认为这没有必要。仅当您希望重建私有成员时才需要这样做。