为什么我不能加载这个先前序列化的对象?
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);
}
}
}
这个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);
}
}
}