Сериализация DisplayObject - PullRequest
       12

Сериализация DisplayObject

1 голос
/ 01 сентября 2009

Можно ли сериализовать экранный объект с помощью ByteArray для его сохранения и восстановления? Flash, ActionScript3 Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2009

Вот пример кода

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 как ByteArray в SharedObject. При втором запуске он пытается присвоить каждое значение из сохраненного объекта ByteArray объекту Sprite на сцене. Это, однако, является ошибочным, и это работает только для свойств, которые не были ссылками. Для других сложных типов выдает ошибку приведения типа.

Итак. Вы можете хранить данные как ByteArray, но вам нужно будет правильно создать экземпляр объекта после. Я хотел бы создать свой собственный DataStoringObject для сохранения только необходимых свойств для создания экземпляра, а затем метод создания экземпляров, который будет считывать объект байта Array и заботиться о размещении объекта на сцене.

2 голосов
/ 01 сентября 2009

вы обычно реализуете IExternalizable ... и затем вы можете просто сериализовать его любым собственным методом сериализации ...

есть определенные вещи, которые вы никогда не сможете сериализовать, как графику в Shape / Sprite и т. Д. ... для библиотечных объектов, это может быть хорошо, для загрузчиков, если вы подкласс их и переопределить некоторые методы, вы также сможете отслеживать операции загрузки и восстанавливать их после десериализации ... пока все, что вы хотите сериализации ISerializable, у вас есть хорошие шансы преуспеть в полном сохранении и восстановлении состояния (кроме графики, как я уже сказал) ...

и не забудьте использовать registerClassAlias ​​, чтобы убедиться, что ваши классы сохраняются ...

тогда удачи ...;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...