flex flash flex3 erlang amf

flex - Flash: AMF3 con tablas de referencia?



flex3 erlang (3)

Creo que la diferencia es que en el primer ejemplo estás escribiendo dos cadenas literales. En el segundo ejemplo, está escribiendo una matriz (o un Objeto complejo en las especificaciones de Adobe) que tiene una referencia a dos cadenas. Entonces, si hace referencia a la cadena desde un objeto o una matriz, la escribirá en la tabla de referencia.

Esto no es necesariamente una forma de aplicarlo, pero parece lógico que el serializador AMF integrado en flash serialice los objetos de esta manera, por lo que es probablemente una forma confiable de obtener el comportamiento deseado (cadenas de tablas de referencia).

¡Espero que sea útil para ti!

La especificación AMF3 define el uso de las llamadas "tablas de referencia" (ver la Sección 2.2 de esta especificación).

Implementé este comportamiento en mi codificador / decodificador AMF3 que desarrollé en Erlang, pero al no tener mucha experiencia con Flash API, apenas puedo encontrar cómo puedo forzar fácilmente a Flash a utilizar estas tablas de referencia al serializar objetos a AMF3; por ejemplo, si uso ByteArray, parece que solo repite codificaciones de objetos completos

var ba:ByteArray = new ByteArray(); ba.writeObject("some string1"); ba.writeObject("some string1"); # => # <<6,25,115,111,109,101,32,115,116,114,105,110,103,49, # 6,25,115,111,109,101,32,115,116,114,105,110,103,49>>

(lo cual es claramente una repetición).

Sin embargo, si estas dos cadenas están en una sola llamada writeObject, parece que utiliza referencias:

ba.writeObject(["some string1", "some string1"]); # => <<9,5,1,6,25,115,111,109,101,32,115,116,114,105,110,103,49,6,0>>

Socket parece comportarse de la misma manera.

Entonces, ¿puedo hacer uso de tablas de referencia en el código Flash? (dado que podría tener un protocolo no estándar entre la aplicación Flash y el servidor)

¡Gracias!


Mira la última página de la especificación oficial de AMF3 y verás que ByteArray es prácticamente inútil. Deberá escribir su propio serializador / deserializador AMF3.


Según la oración final de la especificación AMF3 (especificación AMF 3.0 en Adobe.com ):

También tenga en cuenta que ByteArray usa un nuevo conjunto de tablas de referencia implícitas para objetos, rasgos de objeto y cadenas para cada llamada a readObject y writeObject.

Parece que la intención con ByteArray.writeObject es crear una serialización que pueda ser almacenada o recuperada por objeto.

El comportamiento del objeto NetConnection es similar a lo que esperabas.

Al actualizar la tabla de referencias de cadena, es importante no agregar cadenas vacías a la tabla de referencia.

Al mantener la tabla de referencias a objetos, puede implementar la programación defensiva de la siguiente manera: la tabla de referencias a objetos se construye recursivamente y en ocasiones contiene objetos cuyos rasgos aún no se conocen por completo. Si los índices de la tabla no se asignan de antemano, la numeración será inconsistente en todas las aplicaciones. Un decodificador AMF3 no debe usar los rasgos de un objeto parcialmente construido; dicha entrada debe marcarse como errónea.

La tabla de referencia de cadenas se implementa en el codificador al "etiquetar" objetos de cadenas en memoria a medida que se serializan. La codificación de dos objetos de cadena diferentes con el mismo contenido (cadenas coincidentes) no parece estar codificada con una cadena que haga referencia a la otra. Ambas cadenas se emitirán y no se usará una cadena por referencia.

Puede haber una solución a su pregunta original. Si tiene una cantidad de objetos pertenecientes a la misma clase y desea almacenarlos en un solo almacenamiento, sugiero lo siguiente: Cree un "objeto principal" con referencias a todos los objetos que desea almacenar. Luego use ByteArray.writeObject para persistir ese objeto principal. AMF codificará todos los objetos referenciados y representará los rasgos de las clases de objetos repetidos de una manera eficiente.