Action Message Format ( 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, normalmente un Flash Media Server o alternativas de terceros. El lenguaje Actionscript 3 proporciona clases para codificar y decodificar a partir del formato AMF.
El formato se utiliza a menudo junto con RTMP de Adobe para establecer conexiones y controlar comandos para la entrega de contenido multimedia en tiempo real. En este caso, los datos AMF se encapsulan en un fragmento que tiene un encabezado que define aspectos como la longitud y el tipo del mensaje (si se trata de un "ping", un "comando" o datos multimedia).
AMF se introdujo con Flash Player 6 y esta versión se conoce como AMF0. No se modificó hasta el lanzamiento de Flash Player 9 y ActionScript 3.0, cuando los nuevos tipos de datos y características del lenguaje motivaron una actualización llamada AMF3. [1] Flash Player 10 agregó tipos de datos vectoriales y de 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 servidor.
El siguiente paquete amf es para la transmisión de mensajes fuera de los contenedores o transportes Adobe/Macromedia definidos, como Flash Video o el Protocolo de mensajería en tiempo real .
Si se desconoce la longitud del encabezado o la longitud del mensaje, se establecen en -1 o 0xFFFFFFFF
uimsbf: entero sin signo, el bit más significativo primero
simsbf: entero con signo, bit más significativo primero
El formato especifica los distintos tipos de datos que se pueden utilizar para codificar datos. Adobe afirma que AMF se utiliza 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 datos, como cadenas o números, así como matrices y otros objetos. XML se admite como un tipo nativo. Cada tipo se denota por un solo byte que precede a los datos reales. Los valores de ese byte son los siguientes (para AMF0):
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 de 'definición de tipo' (0x02) 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.
A modo de ejemplo, al codificar el objeto a continuación en código ActionScript 3.
var persona : Objeto = { nombre : 'Mike' , edad : ' 30' , alias : ' Mike' }; var stream : ByteArray = new ByteArray ( ); stream.objectEncoding = ObjectEncoding.AMF0 ; // ByteArray tiene como valor predeterminado AMF3 stream.writeObject ( persona ) ;
Los datos almacenados en ByteArray son:
Nota: las propiedades de los objetos se pueden ordenar en un orden diferente al que tienen en ActionScript. Para ver cómo colorearlas o marcarlas, consulte la leyenda que aparece 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 o, 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, normalmente se encuentra encapsulado en un mensaje RTMP o una llamada Flex RPC. A continuación, se muestra un ejemplo del primero (es el mensaje "_result" devuelto en respuesta al comando "connect" enviado desde el cliente flash):
leyenda: objeto inicio/fin claves del objeto valores del objeto ecma_array
El mensaje AMF comienza con un 0x03
que denota un paquete RTMP con un tipo de encabezado de 0 , por lo que se espera que le sigan 12 bytes. Es de tipo de mensaje 0x14, que denota un comando en forma de cadena con el valor "_result" y dos objetos serializados como argumentos. El mensaje se puede decodificar de la siguiente manera:
( comando ) "_result" ( 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 : ( matriz ) { versión : "3,5,5,2004" }, clientId : 1584259571.0 , objectEncoding : 3.0 }
Aquí se puede ver una matriz (en turquesa) como valor de la clave 'data' que tiene un miembro. Podemos ver que el valor de objectEncoding es 3. Esto significa que los mensajes subsiguientes se enviarán con el tipo de mensaje 0x11, lo que implicará una codificación AMF3.
La última versión del protocolo especifica cambios importantes que permiten un formato más comprimido. Los marcadores de datos son los siguientes:
Los primeros 4 tipos no van seguidos de ningún dato (los valores booleanos tienen dos tipos en AMF3).
Los marcadores adicionales utilizados por Flash Player 10 (el formato todavía se conoce como AMF3) son los siguientes:
AMF3 busca una mayor compresión y una de las formas en que lo logra es evitando la duplicación de cadenas guardándolas en una matriz con la que se verifican todas las cadenas nuevas. El byte que sigue al marcador de cadena ya no denota la longitud pura, sino que es un byte complejo donde el bit menos significativo indica si la cadena está "en línea" (1), es decir, no está en la matriz, o si es "de referencia" (0), en cuyo caso se guarda el índice de la matriz. La tabla incluye claves y valores.
En versiones anteriores de Flash Player existía un tipo de número llamado "Número", que era una codificación de doble precisión de 64 bits. En las últimas versiones, hay un int y un uint que se incluyen en AMF3 como tipos separados. Los tipos de número 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 van seguidos de otro byte.
Los diversos protocolos AMF son compatibles con muchos lenguajes y tecnologías del lado del servidor, en forma de bibliotecas y servicios que el desarrollador de la aplicación debe instalar e integrar.
Plataformas:
Marcos: