2010-09-18 14 views
6

Problema al leer bytearray de objetos personalizados. Cualquier ayuda es apreciadaAS3 Objeto personalizado a ByteArray luego al objeto personalizado

public class CustomObject extends Object { 
public function CustomObject() { 
public var _x:Number = 100 
public var _y:Number = 10 
public var _z:Number = 60 
} 
} 

var cObj:CustomObject = new CustomObject() 
var bytes:ByteArray = new ByteArray() 
bytes.writeObject(cObj) 
bytes.compress() 

//read 
try { bytes.uncompress() } catch (e:Error) { } 
var obj:CustomObject = bytes.readObject() as CustomObject 

trace(obj) // null why?! 
trace(obj._z) // Obviously - TypeError: Error #1009: Cannot access a property or method of a null object reference. 

Respuesta

12

Lo que quieres hacer es usar el registerClassAlias método para registrar información de tipo junto con los datos. De esa forma, Flash sabrá serializar/deserializar su objeto. He aquí algunos ejemplos de código de Adobe de documentation:

registerClassAlias("com.example.eg", ExampleClass); 
var eg1:ExampleClass = new ExampleClass(); 
var ba:ByteArray = new ByteArray(); 
ba.writeObject(eg1); 
ba.position = 0; 
var eg2:* = ba.readObject(); 
trace(eg2 is ExampleClass); // true 

Cabe señalar que todos los tipos que deben ser serializados deben estar registrados para el tipo de información que desea guardar. Entonces, si tiene otro tipo al que hace referencia su tipo, también debe estar registrado.

+1

woah clase de registro, suena caro ... hace que cualquier problema de rendimiento o qué, ah voy a google es – kornesh

+2

No realmente. Almacena información sobre el tipo en los datos, pero no es demasiado ineficiente. En realidad, no afecta el procesamiento ni mucho menos. Se usa para almacenar objetos en el protocolo AMF, que es ampliamente utilizado para la transferencia de datos en la plataforma Flash. Además de almacenar información de tipo manualmente y proporcionar conversión manual de datos de objetos sin formato a tipos específicos, esta es su única opción y no es mala. –

+0

sí Yo uso objetos 'personalizados' para que sea más rápido que el nuevo Objeto(); así que me pregunto si podría causar problemas de rendimiento en As3 – kornesh

0

Vuelve el objeto que ByteArray.readObject() devuelve. Probablemente verá que todas las propiedades están ahí, pero se pierde la información del tipo. Por lo tanto, puede resolver esto mediante la creación de algún

public static function fromObject(value:Object):CustomObject { 
    var result:CustomObject = new CustomObject(); 
    result._x = value._x; 
    //and so on... 
    return result; 
} 
+0

El problema es objeto personalizado tienen otro objeto personalizado en ella ... por ejemplo cObj._myHome = MyHome, donde MyHome: MyHome extiende objeto – kornesh

1

Su clase CustomObject está mal, hay que tirar un error de hecho, debería ser este lugar

 
public class CustomObject 
{ 
    public var _x:Number = 100 
    public var _y:Number = 10 
    public var _z:Number = 60 

    public function CustomObject() 
    { 
    } 
} 

Editar:

Suena como Macke tiene un punto, porque esto funciona ...

 

//read 
try { bytes.uncompress() } catch (e:Error) { } 
var obj:Object = bytes.readObject(); 

trace(obj) // [object Object] 
trace(obj._z) // 60 
+0

No creo que eso importa en este caso lo hace? – kornesh

+0

no estoy seguro, necesitaría probarlo ... ¡aunque la clase CustomObject es un problema más grande! – PatrickS

+0

awesome var obj: Object = bytes.readObject(); y registerClassAlias ​​("com.example.eg", ExampleClass); hace el truco – kornesh

0

Para serializar clases personalizadas al ByteArray, debe poner registerClassAlias en el constructor de la clase que llama a la función byteArray.writeObject().

Si no lo hace, su clase personalizada se serializará como Tipo de objeto. Estaba llamando al registerClassAlias en la función de serialización a continuación y mi clase personalizada sigue siendo serializada como Object hasta que moví el registerClassAlias al constructor.

public class MyClass{ 
    public function MyClass(){ 
     registerClassAlias("com.myclass", MyClass); // Ok, serializes as MyClass 
     serialize(new MyClass()); 
    } 

    private function serialize(_c:MyClass){ 
     var byteArray:ByteArray = new ByteArray(); 
     byteArray.writeObject(_c); 
     //registerClassAlias("com.myclass", MyClass); Not ok, serialized as Object 
     EncryptedLocalStorage.setItem('key', byteArray); 
    } 
} 
+0

la llamada a registerClassAlias ​​debe venir antes de la llamada a ByteArray: writeObject, pero ** no ** tiene que estar en el constructor de la clase que se serializará. –

Cuestiones relacionadas