|
|
|||||
Регистрация: Apr 2011
Сообщений: 61
|
BitmapData в AMF
Здравствуйте.
Создаю файл данных через Flash (flex/Air). Сначала создаю: var newData:Dictionary = new Dictionary(); newData["1"].name = "FirstObj"; newData["1"].bitmapData = myBitmapData; var stream:FileStream = new FileStream(); stream.open(_newFile, FileMode.UPDATE); stream.writeObject(newData); stream.close(); А битмамДата при открытие этого файла возвращает просто Object, который "невозможно преобразовать в BitmapData". |
|
|||||
Регистрация: Apr 2011
Сообщений: 61
|
Как в таком случаем можно сохранить визуальный объект в файл...для последующего извлечения?
|
|
|||||
Если BitmapData - то есть getVector(), который можно записать в исходном виде, либо записать в ByteArray и сжать
__________________
...вселенская грусть |
|
|||||
Регистрация: Apr 2011
Сообщений: 61
|
Спасибо. getVector помогло..
|
|
|||||
Modus ponens
|
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, и таким образом съэкономить дисковое пространство / траффик необходимый для передачи / хранения данных.
__________________
Hell is the possibility of sanity |
Часовой пояс GMT +4, время: 14:45. |
|
« Предыдущая тема | Следующая тема » |
Теги |
AMF , bitmapdata , file |
|
|