Тема: BitmapData в AMF
Показать сообщение отдельно
Старый 19.07.2011, 20:28
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
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