Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   BitmapData в AMF (http://www.flasher.ru/forum/showthread.php?t=160971)

F10 19.07.2011 17:50

BitmapData в AMF
 
Здравствуйте.

Создаю файл данных через Flash (flex/Air).

Сначала создаю:
Код AS3:

var newData:Dictionary = new Dictionary();
newData["1"].name = "FirstObj";
newData["1"].bitmapData = myBitmapData;

и записываю в файл:

Код AS3:

var stream:FileStream = new FileStream();
stream.open(_newFile, FileMode.UPDATE);
stream.writeObject(newData);
stream.close();

Разные текстовые данные сохраняются нормально..
А битмамДата при открытие этого файла возвращает просто Object, который "невозможно преобразовать в BitmapData".

gloomyBrain 19.07.2011 17:56

Визуальные объекты в AMF не кодируются (судя по спецификации AMF)

F10 19.07.2011 18:10

Как в таком случаем можно сохранить визуальный объект в файл...для последующего извлечения?

gloomyBrain 19.07.2011 18:13

Если BitmapData - то есть getVector(), который можно записать в исходном виде, либо записать в ByteArray и сжать

F10 19.07.2011 18:54

Спасибо. getVector помогло..

wvxvw 19.07.2011 20:28

AMF может технически сериализовать любой класс, проблема в другом: при десириализации могут случится две вещи, с которыми AMF никак не справится:
- обязательные аргументы у конструктора.
- реализация и состояние класса не были сериализированы, и поэтому восстановить их никак не получится.

Каким образом AMF записывает объекты: если это один из 13 предопределенных типов - смотри документацию. Если это объект пользовательского класса (в этом случае считаем, что BitmapData - пользовательский класс), то будет записан Object тег + таблиза запечатанных свойств, значения (в том же порядке, что и свойства) +, если класс динамический, список ключей-значений. Пиксели BitmapData не фигурируют ни в одном из ее свойств, а сериализатор не знает о том, как нужно сериализовать экземпляры этого класса, поэтому он запишет экземпляр как объект типа Object с ключами-значениями соответствующими свойствам BitmapData.

Проблемы, которые возникнут при десериализации: конструктор BitmapData требует 2 обязательных параметера - чтобы это обойти нужно отнаследоваться от BitmapData и задать значения по умолчанию (они на самом деле не важны, не понятно зачем они там нужны вообще). Далее, вам нужно будет добавить класс наследник в список известных сериализатору: registerClassAlias(getFullyQualifiedClassName(myExtendedBitmapData)). Но тут уже возникает проблема - пиксели не являются свойством BitmapData - есть 2 варианта решения, 1: создать свойство, при изменении которого будут изменятся пиксели, 2. реализовать в классе-наследнике интерфейс IExternalizable и прочитав из массива в который вы как-то записали пиксели, восстановить изначальное состояние BitmapData. Второй вариант, как по мне, предпочтительнее т.как вы сможете не сохранять бесполезные свойства (типа rect и transparent), кроме того, если сильно напрячься, то можно написать сериализатор, который будет использовать какой-нибудь формат сжатия типа JPEG / PNG, и таким образом съэкономить дисковое пространство / траффик необходимый для передачи / хранения данных.


Часовой пояс GMT +4, время: 10:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.