Формат сообщений действий ( AMF ) — это двоичный формат, используемый для сериализации графов объектов, таких как объекты ActionScript и XML, или для отправки сообщений между клиентом Adobe Flash и удаленной службой, обычно Flash Media Server или сторонними альтернативами. Язык Actionscript 3 предоставляет классы для кодирования и декодирования из формата AMF.
Формат часто используется в сочетании с Adobe RTMP для установления соединений и управления командами для доставки потокового мультимедиа. В этом случае данные AMF инкапсулируются в фрагмент , который имеет заголовок, определяющий такие вещи, как длина и тип сообщения (будь то «ping», «command» или медиаданные).
AMF был представлен в Flash Player 6, и эта версия называется AMF0. Он оставался неизменным до выпуска Flash Player 9 и ActionScript 3.0, когда новые типы данных и языковые возможности вызвали обновление, названное AMF3. [1] Flash Player 10 добавил векторные и словарные типы данных, задокументированные в пересмотренной спецификации от января 2013 года.
Компания Adobe Systems опубликовала спецификацию протокола двоичных данных AMF в декабре 2007 года [2] [3] и объявила, что будет поддерживать сообщество разработчиков, чтобы сделать этот протокол доступным для всех основных серверных платформ.
Следующий amf-пакет предназначен для передачи сообщений за пределами определенных контейнеров Adobe/Macromedia или транспортных средств, таких как Flash Video или Real Time Messaging Protocol .
Если длина заголовка или длина сообщения неизвестны, то они устанавливаются в -1 или 0xFFFFFFFF.
uimsbf: беззнаковое целое число, старший бит первый
simsbf: целое число со знаком, старший бит первый
Формат определяет различные типы данных, которые могут использоваться для кодирования данных. Adobe утверждает, что AMF в основном используется для представления объектных графов, которые включают именованные свойства в форме пар ключ-значение, где ключи кодируются как строки, а значения могут быть любого типа данных, например, строки или числа, а также массивы и другие объекты. XML поддерживается как собственный тип. Каждый тип обозначается одним байтом, предшествующим фактическим данным. Значения этого байта следующие (для AMF0):
Объекты AMF начинаются с (0x03), за которым следует набор пар ключ-значение, и заканчиваются (0x09) в качестве значения (которому предшествует 0x00 0x00 как пустая запись ключа). Ключи кодируются как строки с байтом (0x02) «определение типа» (не включенным в сообщение). Значения могут быть любого типа, включая другие объекты, и таким образом можно сериализовать целые графы объектов. Как ключам объектов, так и строкам предшествуют два байта, обозначающих их длину в байтах. Это означает, что строкам предшествуют в общей сложности три байта, включая байт типа 0x02. Нулевые типы содержат только свое определение типа (0x05). Числа кодируются как числа с плавающей точкой двойной точности и состоят из восьми байтов.
В качестве примера приведем кодирование объекта ниже в коде ActionScript 3.
var person : Object = { name : 'Майк' , age : '30' , alias : 'Майк' }; var stream : ByteArray = new ByteArray (); stream . objectEncoding = ObjectEncoding . AMF0 ; // ByteArray по умолчанию равен AMF3 stream . writeObject ( person );
Данные, хранящиеся в ByteArray:
Примечание: свойства объекта могут быть отсортированы в порядке, отличном от того, в котором они размещены в ActionScript. Для раскрашивания/разметки см. легенду ниже.
Приведенный выше код будет работать только для встроенных классов, таких как Object
. Для сериализации и десериализации пользовательских классов пользователю необходимо объявить их с помощью команды registerClassAlias, иначе проигрыватель выдаст ошибку.
// для гипотетического класса Person registerClassAlias ( "personTypeAlias" , Person );
Хотя, строго говоря, AMF — это всего лишь формат кодирования данных, он обычно инкапсулируется в сообщение RTMP или вызов Flex RPC. Пример первого можно найти ниже (это сообщение "_result", возвращаемое в ответ на команду "connect", отправленную с флэш-клиента):
легенда: начало/конец объекта ключи объекта значения объекта ecma_array
Сообщение AMF начинается с , 0x03
что обозначает пакет RTMP с типом заголовка 0 , поэтому ожидается, что последуют 12 байт. Это сообщение типа 0x14, что обозначает команду в виде строки со значением "_result" и два сериализованных объекта в качестве аргументов. Сообщение можно расшифровать следующим образом:
( команда ) "_результат" ( идентификатор транзакции ) 1 ( значение ) [ 1 ] { fmsVer : "FMS/3,5,5,2004" возможности : 31.0 режим : 1.0 }, [ 2 ] { уровень : "статус" , код : "NetConnection.Connect.Success" , описание : "Подключение успешно установлено." , данные : ( массив ) { версия : "3,5,5,2004" }, clientId : 1584259571.0 , objectEncoding : 3.0 }
Здесь можно увидеть массив (бирюзового цвета) как значение ключа 'data', который имеет один элемент. Мы видим значение objectEncoding, равное 3. Это означает, что последующие сообщения будут отправляться с типом сообщения 0x11, что будет подразумевать кодировку AMF3.
Последняя версия протокола определяет существенные изменения, которые позволяют использовать более сжатый формат. Маркеры данных следующие:
За первыми 4 типами не следуют никакие данные (в AMF3 логические значения имеют два типа).
Дополнительные маркеры, используемые Flash Player 10 (формат по-прежнему называется AMF3), следующие:
AMF3 стремится к большему сжатию, и один из способов достижения этого — избегание дублирования строк путем сохранения их в массиве, по которому проверяются все новые строки. Байт, следующий за маркером строки, больше не обозначает чистую длину, а является сложным байтом, в котором младший бит указывает, является ли строка «встроенной» (1), т. е. не в массиве, или «ссылочной» (0), в этом случае сохраняется индекс массива. Таблица включает как ключи, так и значения.
В более старых версиях Flash Player существовал один числовой тип под названием «Число», который представлял собой 64-битную кодировку двойной точности. В последних выпусках есть int и uint, которые включены в AMF3 как отдельные типы. Числовые типы идентичны кодировке AMF0, в то время как целые числа имеют переменную длину от 1 до 4 байтов, где старший бит байтов 1-3 указывает, что за ними следует другой байт.
Различные протоколы AMF поддерживаются многими серверными языками и технологиями в виде библиотек и служб, которые должны быть установлены и интегрированы разработчиком приложения.
Платформы:
Фреймворки: