为什么我不能加载这个先前序列化的对象?

Why can't I load this previously serialized object?

这个class是可序列化的:

   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 无法再将其类型转换回其原始数据类型。这是预期的行为吗?如果不是,问题是什么,我们该如何解决?

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

Returns 第二个为空 运行:

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

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

Cut/Paste 示例:

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