2010-09-18 13 views
6

Problem beim Lesen von Bytearray von benutzerdefinierten Objekten. Jede Hilfe wird geschätzt.AS3 Benutzerdefiniertes Objekt zu ByteArray dann zu benutzerdefiniertes Objekt

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. 

Antwort

12

Was Sie tun möchten, ist die Verwendung der RegisterClassAlias Methode, um Typinformationen zusammen mit den Daten zu registrieren. Auf diese Weise kann Flash Ihr Objekt serialisieren/deserialisieren. Hier ist ein Beispielcode von der Adobe-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 

Es sollte beachtet werden, dass alle Typen, die serialisiert werden sollen, müssen registriert werden für die Typinformationen gespeichert werden. Wenn Sie also einen anderen Typ haben, auf den Ihr Typ verweist, muss dieser ebenfalls registriert werden.

+1

Woah registrieren Klasse, klingt teuer..gibt das irgendwelche Leistungsprobleme oder was, ah ich google es – kornesh

+2

Nicht wirklich. Es speichert Informationen über den Typ in den Daten, aber es ist nicht zu ineffizient. Es beeinflusst die Verarbeitung nicht wirklich sehr. Es wird verwendet, um Objekte im AMF-Protokoll zu speichern, das häufig für die Datenübertragung in der Flash-Plattform verwendet wird. Abgesehen von der manuellen Speicherung von Typinformationen und der manuellen Konvertierung von Rohobjektdaten zu bestimmten Typen ist dies Ihre einzige Option, und sie ist nicht schlecht. –

+0

ja ich benutze 'benutzerdefinierte' Objekte, so dass es schneller als das neue Objekt(); also frage mich, ob es Leistungsprobleme in seltsamen as3 – kornesh

0

Betrachten Sie das Objekt, das ByteArray.readObject() zurückgibt. Wahrscheinlich werden Sie feststellen, dass alle Eigenschaften vorhanden sind, aber die Typinformationen verloren gehen. So können Sie dieses Problem lösen, indem einige

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

das Problem benutzerdefiniertes Objekt hat ein anderes benutzerdefiniertes Objekt in ihm ... zum Beispiel cObj._myHome = myHome, wo myHome: MyHome-Objekt erweitert – kornesh

1

Ihre CustomObject Klasse falsch ist, sollte es tatsächlich einen Fehler aus, sollte es diese stattdessen

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

    public function CustomObject() 
    { 
    } 
} 

Edit:

Klingt wie macke hat einen Punkt, weil das funktioniert ...

 

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

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

Ich glaube nicht, das wäre egal, in diesem Fall tut es? – kornesh

+0

Ich bin mir nicht sicher, müsste es tatsächlich testen ... die CustomObject-Klasse ist jedoch ein größeres Problem! – PatrickS

+0

ehrfürchtiges var obj: Object = bytes.readObject(); und registerClassAlias ​​("com.example.eg", ExampleClass); macht den Trick – kornesh

0

Um die benutzerdefinierten Klassen in die ByteArray zu serialisieren, müssen Sie registerClassAlias in den Konstruktor der Klasse eingeben, die die byteArray.writeObject()-Funktion aufruft.

Wenn nicht, wird Ihre benutzerdefinierte Klasse als Objekttyp serialisiert. Ich rief registerClassAlias in der Serialisierungsfunktion unten an, und meine benutzerdefinierte Klasse wird fortlaufend als Object serialisiert, bis ich die registerClassAlias in den Konstruktor verschoben habe.

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

Der Aufruf von registerClassAlias ​​muss vor dem Aufruf von ByteArray kommen: writeObject, aber ** muss nicht im Konstruktor der zu serialisierenden Klasse enthalten sein. –

Verwandte Themen