Actionscript 3 显示对象序列化

Actionscript 3 显示对象序列化,actionscript-3,Actionscript 3,是否可以使用ByteArray序列化显示对象以存储和恢复它? Flash,ActionScript3 谢谢您的帮助。下面是一个代码示例 import flash.display.Sprite; import flash.utils.ByteArray; import flash.display.Graphics; var savedData:SharedObject = SharedObject.getLocal("savedData"); var sprite:Sprite = new S

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

下面是一个代码示例

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对象中的每个值指定给场景中的精灵。但是,这是错误的,它仅适用于非引用的属性。对于其他复杂类型,它抛出类型强制错误

所以。您可以将数据存储为ByteArray,但必须在之后正确实例化对象。 我将创建自己的DataStoringObject,以便只保存实例化所需的属性,然后创建一个实例化方法,该方法将读取字节数组对象并负责将对象放置在舞台上。

下面是一个代码示例

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对象中的每个值指定给场景中的精灵。但是,这是错误的,它仅适用于非引用的属性。对于其他复杂类型,它抛出类型强制错误

所以。您可以将数据存储为ByteArray,但必须在之后正确实例化对象。 我将创建自己的DataStoringObject,以便只保存实例化所需的属性,然后创建一个实例化方法,该方法将读取字节数组对象并负责将对象放置在舞台上。

您通常会实现。。。然后,您可以简单地用任何本机序列化方法对其进行序列化

有些东西,你永远无法序列化,比如
形状中的图形
/
精灵
,等等。。。对于库对象,这是可以的,对于加载程序,如果您对它们进行子类化并重写某些方法,您还可以跟踪加载操作并在反序列化后恢复它们。。。只要您想要序列化的任何东西都是可ISerializable的,您就有很好的机会成功地完全存储和恢复状态(如我所说的,图形除外)

别忘了使用,确保你的类是保守的

那么祝你好运……;)

您通常会实现。。。然后,您可以简单地用任何本机序列化方法对其进行序列化

有些东西,你永远无法序列化,比如
形状中的图形
/
精灵
,等等。。。对于库对象,这是可以的,对于加载程序,如果您对它们进行子类化并重写某些方法,您还可以跟踪加载操作并在反序列化后恢复它们。。。只要您想要序列化的任何东西都是可ISerializable的,您就有很好的机会成功地完全存储和恢复状态(如我所说的,图形除外)

别忘了使用,确保你的类是保守的

那么祝你好运……;)