DisplayObject序列化

时间:2009-09-01 09:49:42

标签: actionscript-3

是否可以使用ByteArray序列化显示对象来存储和恢复它? Flash,ActionScript3 谢谢你的帮助。

2 个答案:

答案 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,以确保您的课程得到保护......

祝你好运......;)