为什么我无法加载此先前序列化的对象?

时间:2016-04-01 02:01:39

标签: actionscript-3 flash serialization

这个类是可序列化的:

   package com.things {
        public class MySerializableObject {
            public var intVals:Array;
            public var numVals:Array;
            public var stringVals:Array

            public function MySerializableObject() {

            }

            public function init(ints:Vector.<int>, nums:Vector.<Number>, strings:Vector.<String>) {
                intVals = new Array();
                for each (var i:int in ints) {
                    intVals.push(i);
                }
                numVals = new Array();
                for each (var n:Number in nums) {
                    numVals.push(n);
                }
                stringVals = new Array();
                for each (var s:String in strings) {
                    stringVals.push(s);
                }
            }
        }
    }

我们可以这样做:

registerClassAlias("com.things.MySerializableObject", MySerializableObject);

然后这样做:

var sharedObject:SharedObject = SharedObject.getLocal(SAVE_NAME); //SAVE_NAME is a string constant
var mso:MySerializableObject = getInitializedMSO();
sharedObject.data.mso = mso;
sharedObject.flush();

var newMSO:MySerializableObject = sharedObject.data.mso as MySerializableObject;
trace(newMSO); //outputs "[Object MySerializableObject]"

但是,如果我们重新启动应用程序并执行此操作:

var sharedObject:SharedObject = SharedObject.getLocal(SAVE_NAME); 
registerClassAlias("com.things.MySerializableObject", MySerializableObject);
var previouslySavedMSO:MySerializableObject = sharedObject.data.mso as MySerializableObject;
trace(previouslySavedMSO); //outputs "null"

在关闭并重新打开应用程序后,Flash显然无法将保存的对象作为MySerializableObject读取。通过检查调试器中的SO,我们可以看到数据仍然存在,但Flash无法再将其转换回原始数据类型。这是预期的行为吗?如果没有,问题是什么,我们如何解决?

1 个答案:

答案 0 :(得分:3)

您必须在从LSO(或字节流等)读取之前注册您的类别名,否则您将得到一个匿名对象。由于您要通过as进行投射,因此结果将为空。

第二次运行时返回null:

    var sharedObject:SharedObject = SharedObject.getLocal(SAVE_NAME);
    registerClassAlias("com.things.MySerializableObject", MySerializableObject);
    if (sharedObject.size > 0) {
        var newMSO:MySerializableObject = sharedObject.data.mso as MySerializableObject;
        trace(newMSO);
    } else {
        sharedObject.data.mso = getInitializedMSO();
        sharedObject.flush();
        trace(sharedObject.data.mso);
    }

在第二次运行时返回MySerializableObject

    registerClassAlias("com.things.MySerializableObject", MySerializableObject);
    var sharedObject:SharedObject = SharedObject.getLocal(SAVE_NAME);
    if (sharedObject.size > 0) {
        var newMSO:MySerializableObject = sharedObject.data.mso as MySerializableObject;
        trace(newMSO);
    } else {
        sharedObject.data.mso = getInitializedMSO();
        sharedObject.flush();
        trace(sharedObject.data.mso);
    }

剪切/粘贴示例:

package {

import flash.display.Sprite;
import flash.net.SharedObject;
import flash.net.registerClassAlias;

public class Main extends Sprite {
    private const SAVE_NAME:String = "foobar";

    public function Main() {
        registerClassAlias("com.things.MySerializableObject", MySerializableObject);
        var sharedObject:SharedObject = SharedObject.getLocal(SAVE_NAME);
        if (sharedObject.size > 0) {
            var newMSO:MySerializableObject = sharedObject.data.mso as MySerializableObject;
            trace(newMSO);
        } else {
            sharedObject.data.mso = getInitializedMSO();
            sharedObject.flush();
            trace(sharedObject.data.mso);
        }
    }

    public function getInitializedMSO():MySerializableObject {
        return new MySerializableObject();
    }
}
}

class MySerializableObject {
    public var intVals:Array;
    public var numVals:Array;
    public var stringVals:Array

    public function MySerializableObject() {

    }

    public function init(ints:Vector.<int>, nums:Vector.<Number>, strings:Vector.<String>) {
        intVals = new Array();
        for each (var i:int in ints) {
            intVals.push(i);
        }
        numVals = new Array();
        for each (var n:Number in nums) {
            numVals.push(n);
        }
        stringVals = new Array();
        for each (var s:String in strings) {
            stringVals.push(s);
        }
    }
}