Сериализация Scene3D Papervision3D
Я пытаюсь сериализовать всю сцену, чтобы сохранить ее в файл и загрузить позже. Я знаю, что Pv3D не лучший 3D-движок для работы сейчас, но я не хочу начинать весь проект снова. Проблема возникает при попытке загрузить фактический файл и присвоить его данные сцене, что приводит к ошибке #1009 (нулевой объект).
Вот код:
/* Papervision3D engine setup code here */
//...
var scene:Scene3D = new Scene3D();
//...
var file:FileReference;
function LoadProyect(e:MouseEvent):void
{
var fd:String = "3Dp Files (*.3dp)";
var fe:String = "*.3dp";
var ff:FileFilter = new FileFilter(fd,fe);
file = new FileReference();
file.browse(new Array(ff));
file.addEventListener(Event.SELECT, onFileSelect);
file.addEventListener(Event.COMPLETE, fileComplete);
}
function onFileSelect(e:Event):void
{
file.load();
}
function fileComplete(e:Event):void
{
var aScene:ByteArray = e.target.data;
var objScene:Object = aScene.readObject();
scene = objScene as Scene3D;
}
Итак, Scene3D сериализуем? (Я предполагаю, что они на самом деле выводят данные при сериализации в текстовом файле), и возможно ли это? Или я должен сохранить каждый объект отдельно и загрузить его один за другим, а затем добавить его на сцену?
1 ответ
Глава 2 "Что вы можете сделать с байтами?" должен дать вам отправную точку для чтения и записи объектов в ByteArray
,
Кстати говоря, основная функциональность заключается в writeObject()
а также readObject()
обе ссылки на registerClassAlias()
как связанный элемент API.
Его документация говорит сама за себя:
Сохраняет класс (тип) объекта, когда объект закодирован в формате Action Message Format (AMF). Когда вы кодируете объект в AMF, эта функция сохраняет псевдоним для своего класса, чтобы вы могли восстановить класс при декодировании объекта. Если контекст кодирования не зарегистрировал псевдоним для класса объекта, объект кодируется как анонимный объект. Аналогично, если контекст декодирования не имеет зарегистрированного псевдонима, анонимный объект создается для декодированных данных.
Вам необходимо зарегистрировать класс, чтобы десериализовать его объекты.
Проблема в том, что только public
члены класса де-сериализуются таким образом по умолчанию. Чтобы определить пользовательскую де-сериализацию, вам необходимо реализовать IExternalizable
интерфейс:
Интерфейс IExternalizable обеспечивает управление сериализацией класса по мере его кодирования в поток данных. Методы writeExternal() и readExternal() интерфейса IExternalizable реализуются классом для настройки содержимого и формата потока данных.
Конечно, это было бы много работы, потому что Papervision3D не реализует этот интерфейс. Вы можете расширить соответствующие классы и реализовать интерфейс, но есть вероятность, что вы что-то упустили. Вы должны были бы знать всю внутреннюю работу классов. Видишь ли, если registerClassAlias()
достаточно сначала.