El formato de mensaje de acción ( AMF ) es un formato binario que se utiliza para serializar gráficos de objetos, como objetos ActionScript y XML, o para enviar mensajes entre un cliente Adobe Flash y un servicio remoto, generalmente un servidor Flash Media Server o alternativas de terceros. El lenguaje ActionScript 3 proporciona clases para codificar y decodificar el formato AMF.
Este formato se suele utilizar junto con el protocolo RTMP de Adobe para establecer conexiones y controlar comandos para la transmisión de contenido multimedia . En este caso, los datos AMF se encapsulan en un fragmento que contiene una cabecera que define aspectos como la longitud y el tipo de mensaje (si se trata de un "ping", un "comando" o datos multimedia).
Análisis de formato
AMF se introdujo con Flash Player 6, y esta versión se conoce como AMF0. No sufrió cambios hasta el lanzamiento de Flash Player 9 y ActionScript 3.0, cuando los nuevos tipos de datos y características del lenguaje impulsaron una actualización, denominada AMF3. [ 1 ] Flash Player 10 añadió los tipos de datos de vector y diccionario documentados en una especificación revisada de enero de 2013.
Adobe Systems publicó la especificación del protocolo de datos binarios AMF en diciembre de 2007 [ 2 ] [ 3 ] y anunció que apoyará a la comunidad de desarrolladores para que este protocolo esté disponible para todas las principales plataformas de servidores.
Paquete autónomo AMF
El siguiente paquete amf se utiliza para la transmisión de mensajes fuera de los contenedores o protocolos de transporte definidos por Adobe/Macromedia, como Flash Video o el Protocolo de Mensajería en Tiempo Real (RTP) .
Si se desconoce la longitud del encabezado o la longitud del mensaje, se establecen en -1 o 0xFFFFFFFF.
uimsbf: entero sin signo, bit más significativo primero
simsbf: entero con signo, bit más significativo primero
AMF0
El formato especifica los distintos tipos de datos que se pueden usar para codificar datos. Adobe indica que AMF se usa principalmente para representar gráficos de objetos que incluyen propiedades con nombre en forma de pares clave-valor, donde las claves se codifican como cadenas y los valores pueden ser de cualquier tipo de dato, como cadenas o números, así como matrices y otros objetos. XML es compatible como tipo nativo. Cada tipo se indica mediante un byte que precede a los datos reales. Los valores de ese byte son los siguientes (para AMF0):
- Número - 0x00 (Codificado como número de punto flotante de doble precisión IEEE de 64 bits )
- Booleano - 0x01 (Codificado como un solo byte con valor 0x00 o 0x01)
- Cadena - 0x02 (longitud de cadena entera de 16 bits con codificación UTF-8)
- Objeto - 0x03 (Conjunto de pares clave/valor)
- Nulo - 0x05
- Matriz ECMA - 0x08 (contador de entradas de 32 bits)
- Fin del objeto: 0x09 (precedido por una longitud de cadena vacía de 16 bits)
- Matriz estricta - 0x0a (contador de entradas de 32 bits)
- Fecha: 0x0b (codificada como número de punto flotante de doble precisión IEEE de 64 bits con desplazamiento de zona horaria entero de 16 bits)
- Cadena larga - 0x0c (longitud de cadena entera de 32 bits con codificación UTF-8)
- Documento XML - 0x0f (longitud de cadena entera de 32 bits con cadena UTF-8)
- Objeto tipado: 0x10 (longitud del nombre entero de 16 bits con nombre UTF-8, seguido de entradas)
- Cambiar a AMF3 - 0x11
Los objetos AMF comienzan con un (0x03) seguido de un conjunto de pares clave-valor y terminan con un (0x09) como valor (precedido por 0x00 0x00 como entrada de clave vacía). Las claves se codifican como cadenas con el byte (0x02) de 'definición de tipo' implícito (no incluido en el mensaje). Los valores pueden ser de cualquier tipo, incluidos otros objetos, y los gráficos de objetos completos se pueden serializar de esta manera. Tanto las claves de objeto como las cadenas están precedidas por dos bytes que indican su longitud en número de bytes. Esto significa que las cadenas están precedidas por un total de tres bytes que incluyen el byte de tipo 0x02. Los tipos nulos solo contienen su definición de tipo (0x05). Los números se codifican como punto flotante de doble precisión y se componen de ocho bytes.
Como ejemplo, al codificar el siguiente objeto en código ActionScript 3.
var person : Object = { name : 'Mike' , age : '9.75' , alias : 'Mike' }; var stream : ByteArray = new ByteArray (); stream . objectEncoding = ObjectEncoding . AMF0 ; // ByteArray por defecto es AMF3 stream . writeObject ( person );Los datos contenidos en el ByteArray son:
Nota: las propiedades del objeto pueden ordenarse de forma diferente a como aparecen en ActionScript. Para ver el código fuente (coloreado/marcado), consulte la leyenda a continuación.
El código anterior solo funcionará para clases integradas como Object. Para serializar y deserializar clases personalizadas, el usuario debe declararlas mediante el comando registerClassAlias; de lo contrario, el reproductor generará un error.
// para una clase hipotética Persona registerClassAlias ( "personTypeAlias" , Persona );Aunque, estrictamente hablando, AMF es solo un formato de codificación de datos, generalmente se encuentra encapsulado en un mensaje RTMP o en una llamada Flex RPC. Un ejemplo del primero se puede encontrar a continuación (es el mensaje "_result" devuelto en respuesta al comando "connect" enviado desde el cliente flash):
leyenda: inicio/fin del objeto claves del objeto valores del objeto ecma_array
El mensaje AMF comienza con una 0x03coma que indica un paquete RTMP con tipo de encabezado 0 , por lo que se esperan 12 bytes a continuación. Es de tipo de mensaje 0x14, que indica un comando en forma de una cadena con el valor "_result" y dos objetos serializados como argumentos. El mensaje se puede decodificar de la siguiente manera:
( comando ) "_resultado" ( id de transacción ) 1 ( valor ) [ 1 ] { fmsVer : "FMS/3,5,5,2004" capacidades : 31.0 modo : 1.0 }, [ 2 ] { nivel : "estado" , código : "NetConnection.Connect.Success" , descripción : "Conexión exitosa." , datos : ( array ) { versión : "3,5,5,2004" }, clientId : 1584259571.0 , objectEncoding : 3.0 }Aquí se puede observar un array (en color turquesa) como valor de la clave 'data', que contiene un único elemento. El valor de objectEncoding es 3. Esto significa que los mensajes subsiguientes se enviarán con el tipo de mensaje 0x11, lo que implica una codificación AMF3.
AMF3
La última versión del protocolo especifica cambios significativos que permiten un formato más comprimido. Los marcadores de datos son los siguientes:
- Indefinido - 0x00
- Nulo - 0x01
- Booleano Falso - 0x02
- Booleano Verdadero - 0x03
- Entero - 0x04 (entero expandible de 8 o más bits)
- Doble - 0x05 (Codificado como número de punto flotante de doble precisión IEEE de 64 bits )
- Cadena - 0x06 (longitud de cadena entera expandible de 8 o más bits con una cadena UTF-8)
- XMLDocument - 0x07 (longitud de cadena entera expandible de 8 o más bits y/o indicadores con una cadena UTF-8)
- Fecha: 0x08 (indicadores enteros expandibles de 8 o más bits con una hora de desplazamiento UTC de punto flotante de doble precisión IEEE de 64 bits )
- Matriz - 0x09 (contador de entradas enteras de 8 o más bits expandible y/o indicadores con longitudes de nombres enteras de 8 o más bits expandibles opcionales con nombres UTF-8)
- Objeto - 0x0A (contador de entradas enteras de 8 o más bits expandible y/o indicadores con longitudes de nombres enteras de 8 o más bits expandibles opcionales con nombres UTF-8)
- XML - 0x0B (indicadores enteros expandibles de 8 o más bits)
- ByteArray - 0x0C (banderas enteras expandibles de 8 o más bits con longitud de byte opcional de 8 bits)
Los primeros 4 tipos no van seguidos de ningún dato (los booleanos tienen dos tipos en AMF3).
Los marcadores adicionales utilizados por Flash Player 10 (el formato todavía se denomina AMF3) son los siguientes:
- VectorInt - 0x0D
- VectorUInt - 0x0E
- VectorDouble - 0x0F
- VectorObject - 0x10
- Diccionario - 0x11
AMF3 busca una mayor compresión y una de las maneras en que lo logra es evitando la duplicación de cadenas al guardarlas en un array con el que se comparan todas las cadenas nuevas. El byte que sigue al marcador de cadena ya no indica la longitud pura, sino que es un byte complejo donde el bit menos significativo indica si la cadena es "en línea" (1), es decir, no está en el array, o "de referencia" (0), en cuyo caso se guarda el índice del array. La tabla incluye claves y valores.
En versiones anteriores de Flash Player existía un tipo de dato numérico llamado "Number", que utilizaba una codificación de doble precisión de 64 bits. En las versiones más recientes, se incluyen los tipos int y uint en AMF3 como tipos separados. Los tipos numéricos son idénticos a la codificación AMF0, mientras que los enteros tienen una longitud variable de 1 a 4 bytes, donde el bit más significativo de los bytes 1 a 3 indica que les sigue otro byte.
Apoyo a AMF
Los distintos protocolos AMF son compatibles con numerosos lenguajes y tecnologías del lado del servidor, en forma de bibliotecas y servicios que deben ser instalados e integrados por el desarrollador de la aplicación.
Plataformas:
- ColdFusion - [ 4 ]
- Haxe - Haxe Remoting hxformat
- Java - Adobe BlazeDS , Adobe LiveCycle Data Services (anteriormente conocido como Flex Data Services) , Exadel Flamingo , RED 5 (archivado el 23/10/2019 en Wayback Machine) , Cinnamon , OpenAMF , Pimento , Granite , WebORB para Java
- .NET - WebORB para .NET , FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (desarrollo detenido)
- PHP - AmfPHP , SabreAMF Archivado el 18/05/2014 en Wayback Machine , WebORB para PHP , Zend_Amf , extensión php-amf3 , Baguette AMF (extensión de PHP)
- Python - amfast
- Perl - AMF::Perl , Storeble::AMF , AMF::Connection
- Curl - Servicios de datos de Curl
- Ruby - RubyAMF Archivado el 18/05/2014 en Wayback Machine , WebORB para Rails , Rocket AMF
- Erlang - Erlang-AMF
- ActionScript - Flash Player ByteArray (integrado), Biblioteca CourseVector
- JavaScript - Biblioteca CourseVector de JSAMF CourseVector .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (etapa inicial)
- Delphi - kbmMW (amplio soporte para AMF0/AMF3)
- iOS - CocoaAMF
- PowerShell - PowerShell AMF
Marcos de trabajo:
- Comunicación de Apache Royale con AMF y RemoteObject - Apache Royale
- Ruby on Rails - RubyAMF
- Zend Framework - Zend_AMF
- Marco de trabajo OSGi - AMF3 para OSGi
- Django - Django AMF
- CakePHP - CakeAMFPHP
- Grial (marco de trabajo) - BlazeDS
- Trac - TracRpcProtocolsPlugin . Se requiere la versión 1.1.0 (o superior) de XmlRpcPlugin .
- Web2py - PyAMF
Véase también
Referencias
- ↑ "Formato de mensaje de acción -- AMF 3" (PDF) . Enero de 2013. Consultado el 1 de mayo de 2021 .
- ↑ "Formato de mensaje de acción -- AMF 0" (PDF) . 2007. Consultado el 1 de mayo de 2021 .
- ↑ "Adobe abre AMF y libera el código fuente del marco de trabajo de acceso remoto utilizado en aplicaciones web enriquecidas" . Ars Technica . Consultado el 31 de diciembre de 2017 .
- ↑ Características | Adobe ColdFusion 9 Standard
- Adobe Flash
- formatos de serialización de datos