这个类是可序列化的:
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无法再将其转换回原始数据类型。这是预期的行为吗?如果没有,问题是什么,我们如何解决?
答案 0 :(得分:3)
您必须在从LSO(或字节流等)读取之前注册您的类别名,否则您将得到一个匿名对象。由于您要通过as
进行投射,因此结果将为空。
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);
}
}
}