Открыть сервис

Формат AMF

AMF (от англ. Action Message Format) — это бинарный протокол сериализации данных, разработанный компанией Adobe Systems. Он используется для обмена данными между клиентскими приложениями и серверами, в первую очередь в среде Adobe Flash Player и Adobe AIR. AMF позволяет эффективно кодировать сложные структуры данных, такие как объекты, массивы и строки, в компактный бинарный формат, что снижает объём передаваемой информации и ускоряет её обработку по сравнению с текстовыми форматами, такими как XML или JSON.

История

Протокол AMF был создан компанией Macromedia (позднее приобретённой Adobe Systems) в начале 2000-х годов. Первоначально он разрабатывался для обеспечения эффективной связи между Flash-приложениями и серверными технологиями, такими как Flash Communication Server (позднее — Flash Media Server). Первая версия протокола, AMF0, была представлена в 2001 году. Она включала базовые типы данных и механизмы сериализации, что позволило Flash-приложениям динамически обмениваться данными с серверами.

В 2007 году Adobe выпустила спецификацию AMF3, которая значительно расширила возможности протокола. AMF3 ввёл поддержку новых типов данных, включая строки с кодировкой UTF-8, даты, массивы с произвольными ключами и бинарные данные (ByteArray). Кроме того, AMF3 оптимизировал сериализацию объектов за счёт введения концепции «ссылок» (references), позволяющей избежать повторной передачи одних и тех же данных. Это сделало AMF3 более эффективным и гибким по сравнению с AMF0.

В 2008 году Adobe опубликовала спецификации AMF0 и AMF3 в открытом доступе, что способствовало созданию сторонних реализаций протокола на различных языках программирования. Протокол стал широко использоваться в веб-разработке, особенно в проектах, основанных на технологии Adobe Flex и Flash Remoting. Однако с упадком Adobe Flash в 2010-х годах популярность AMF снизилась, хотя он продолжает применяться в устаревших системах и некоторых современных проектах, например, в игровых движках и системах реального времени.

Версии протокола

AMF0

AMF0 — это первая версия протокола, которая поддерживает следующие типы данных:

  • Числа (Number) — 64-битные числа с плавающей запятой двойной точности.
  • Логические значения (Boolean).
  • Строки (String) — строки в кодировке UTF-8.
  • Объекты (Object) — анонимные объекты с именованными свойствами.
  • Массивы (Array) — индексированные массивы.
  • Даты (Date) — дата и время в формате UTC.
  • null и undefined — специальные значения.
  • Ссылки на объекты (Object references) — механизм для повторного использования ранее переданных объектов.

AMF0 использует простую схему кодирования, где каждый тип данных имеет свой идентификатор (маркер). Сериализация выполняется последовательно, без оптимизации повторяющихся данных. Это делает AMF0 менее эффективным для сложных структур с множеством одинаковых объектов.

AMF3

AMF3 — это вторая версия протокола, которая включает все возможности AMF0 и добавляет новые:

  • Строки с кодировкой UTF-8 (String) — более компактное представление строк.
  • Массивы с произвольными ключами (Associative array) — массивы, где ключи могут быть строками.
  • Бинарные данные (ByteArray) — необработанные двоичные данные.
  • Объекты с типом (Typed object) — объекты, которые могут быть связаны с определённым классом на сервере.
  • Ссылки на строки и объекты (String references и Object references) — оптимизация, позволяющая передавать одну строку или объект только один раз.
  • Векторы (Vector) — типизированные массивы фиксированной длины, такие как Vector.<int>, Vector.<uint>, Vector.<double> и Vector.<Object>.

AMF3 также вводит концепцию «тракта» (trait), который описывает структуру объекта (набор свойств). Тракты могут быть повторно использованы для разных объектов одного типа, что значительно сокращает объём данных.

Структура сообщения

Сообщение AMF состоит из заголовка и тела. Заголовок содержит информацию о версии протокола, а также может включать дополнительные метаданные, такие как идентификатор сессии или команды. Тело сообщения содержит сериализованные данные, которые могут быть как простыми значениями, так и сложными структурами.

В контексте Flash Remoting сообщение AMF обычно включает:

  • Команду (command) — указывает, какое действие должно быть выполнено на сервере (например, вызов метода).
  • Параметры (parameters) — данные, передаваемые в метод.
  • Результат (result) — данные, возвращаемые сервером после выполнения команды.

Применение

Flash Remoting

Основное применение AMF — это технология Flash Remoting, которая позволяет Flash-приложениям вызывать удалённые методы на сервере и получать результаты в виде сериализованных данных. Серверные технологии, поддерживающие Flash Remoting, включают:

  • Adobe ColdFusion — встроенная поддержка AMF через компоненты ColdFusion.
  • Adobe BlazeDS — серверное решение для Java, предоставляющее API для работы с AMF.
  • Adobe LiveCycle Data Services (LCDS) — коммерческое расширение BlazeDS с дополнительными функциями.
  • Сторонние реализации, такие как amfphp (PHP), PyAMF (Python), RubyAMF (Ruby) и другие.

Игровая индустрия

AMF использовался в многопользовательских онлайн-играх, разработанных на Adobe Flash, для обмена данными между клиентом и сервером. Например, игры на платформе Kongregate или Armor Games часто применяли AMF для передачи состояний игроков, результатов и игровых событий.

Системы реального времени

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

Сравнение с другими форматами

ХарактеристикаAMFJSONXMLProtocol Buffers
Тип форматаБинарныйТекстовыйТекстовыйБинарный
Размер данныхМеньше (сжатие за счёт бинарности)Больше (избыточность)Большой (избыточность)Меньше (сжатие)
Скорость сериализацииВысокаяСредняяНизкаяВысокая
ЧитаемостьНизкая (требуется парсер)ВысокаяВысокаяНизкая
Поддержка сложных типовДа (объекты, массивы, даты)Ограниченная (только базовые)Да (через схемы)Да (через схемы)
ПопулярностьНизкая (устаревшая технология)ВысокаяВысокаяВысокая

Критика и недостатки

Основной недостаток AMF — его тесная привязка к экосистеме Adobe Flash, которая к середине 2020-х годов практически полностью вышла из употребления. С прекращением поддержки Flash Player в 2020 году большинство приложений, использующих AMF, стали неработоспособны. Кроме того, AMF является проприетарным протоколом, хотя его спецификации открыты. Это ограничивает его применение в современных проектах, где предпочтение отдаётся открытым стандартам, таким как JSON или Protocol Buffers.

Другой недостаток — сложность отладки. Бинарный формат AMF нечитаем для человека, что затрудняет диагностику ошибок при разработке. Для анализа сообщений AMF требуются специализированные инструменты, такие как Charles Proxy или Wireshark с поддержкой AMF.

Будущее

С упадком Adobe Flash протокол AMF утратил своё значение. Однако он всё ещё используется в некоторых устаревших системах, особенно в корпоративной среде, где миграция на новые технологии требует значительных затрат. В современных проектах AMF практически не применяется, уступив место JSON, Protocol Buffers, MessagePack и другим форматам.

Источники

  • Adobe Systems. «Action Message Format (AMF) Specification». 2008.
  • Adobe Systems. «BlazeDS Developer Guide». 2010.
  • Статья «AMF» в английской Википедии (версия от 2023 года).
  • Документация по amfphp (amfphp.org).
  • Сравнение форматов сериализации данных (статья на Habr, 2019).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →