是否可以使用ByteArray序列化显示对象来存储和恢复它? Flash,ActionScript3 谢谢你的帮助。
答案 0 :(得分:3)
这是一个代码示例
import flash.display.Sprite;
import flash.utils.ByteArray;
import flash.display.Graphics;
var savedData:SharedObject = SharedObject.getLocal("savedData");
var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0xFF0000, 0.5);
sprite.graphics.drawRect(0, 0, 40, 40);
this.addChild(sprite);
// first run
if (!savedData.data.spriteData) {
sprite.x = 100 + Math.random()*300
sprite.y = Math.random()*300
sprite.rotation = Math.random()*90;
sprite.scaleX = sprite.scaleY = 0.5 + Math.random();
savedData.data.spriteData = new ByteArray();
savedData.data.spriteData.writeObject(sprite);
}else {
var sd:Object = savedData.data.spriteData.readObject();
for (var s in sd) {
try {
sprite[s] = sd[s];
} catch (e:Error) {
trace("ERROR "+e);
}
}
}
在第一次运行时,它会随机在舞台上放置一个精灵。然后它将AMF格式的显示对象保存为SharedObject中的ByteArray。 在第二次运行时,它尝试将保存的ByteArray对象中的每个值分配给场景中的Sprite。但这有问题,它只适用于非引用的属性。对于其他复杂类型,它会抛出类型强制错误。
因此。您可以将数据存储为ByteArray,但您必须在之后正确实例化该对象。 我会创建自己的DataStoringObject,只保存实例化所需的属性,然后是一个实例化方法,它将读取字节Array对象并负责将对象放在舞台上。
答案 1 :(得分:2)
您通常会实现IExternalizable ...然后您可以使用任何本机序列化方法对其进行序列化...
有某些事情,你永远无法序列化,如Shape
/ Sprite
中的图形等...对于图书馆对象,这对于装载机来说可能没问题,如果你对它们进行子类化并覆盖某些方法,你也可以跟踪加载操作并在反序列化后恢复它们......只要你想要序列化的任何东西都是ISerializable,你就有很大的机会成功地完全存储和恢复状态(除了图形,正如我所说)......
并且不要忘记使用registerClassAlias,以确保您的课程得到保护......
祝你好运......;)