2010-09-18 238 views
6

讀取自定義對象的bytearray時出現問題。任何幫助表示讚賞AS3自定義對象到ByteArray然後到自定義對象

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. 

回答

12

你想要做的是使用registerClassAlias方法來註冊類型信息和數據。這樣Flash就會知道如何序列化/反序列化你的對象。下面是來自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 

應當指出的是,所有類型應序列必須註冊才能將其保存類型的信息。所以如果你有另一種類型被你的類型引用,它也必須被註冊。

+1

woah註冊類,聽起來昂貴..是否導致任何性能問題或什麼,啊我會谷歌它 – kornesh 2010-09-18 10:27:25

+2

不是。它確實存儲了關於數據類型的信息,但效率並不高。它並不會真正影響處理。它用於存儲AMF協議中的對象,該協議廣泛用於Flash平臺中的數據傳輸。除了手動存儲類型信息和提供從原始對象數據到特定類型的手動轉換之外,這是您唯一的選擇,並且不錯。 – 2010-09-18 11:13:12

+0

是的我使用'自定義'的對象,使其比新的對象();所以想知道它是否會導致奇怪的性能問題as3 – kornesh 2010-09-18 11:38:02

0

看看ByteArray.readObject()返回的對象。您可能會看到所有屬性都存在,但類型信息丟失。所以,你可以通過創建解決一些這方面的

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

問題自定義對象有另一個自定義對象在它...例如cObj._myHome = MYHOME,其中MYHOME:是MyHome擴展對象 – kornesh 2010-09-18 10:12:17

1

你CustomObject類是錯誤的,它實際上應該拋出一個錯誤,那它應該是代替

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

    public function CustomObject() 
    { 
    } 
} 

編輯:

聽起來像MACKE有一個點,因爲這個工程...

 

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

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

我不認爲這事在這種情況下,不是嗎? – kornesh 2010-09-18 10:14:33

+0

實際上我不太確定,需要測試它......儘管CustomObject類是一個更大的問題! – PatrickS 2010-09-18 10:42:00

+0

awesome var obj:Object = bytes.readObject();和registerClassAlias(「com.example.eg」,ExampleClass); 竅門 – kornesh 2010-09-18 11:36:07

0

要將自定義類序列化到ByteArray,必須在調用byteArray.writeObject()函數的類的構造函數中放置registerClassAlias

如果您不這樣做,您的自定義類將被序列化爲對象類型。我在下面的序列化函數中調用了registerClassAlias,我的自定義類不斷被序列化爲Object,直到我將registerClassAlias移動到構造函數中。

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

對registerClassAlias的調用必須在對ByteArray:writeObject的調用之前進行,但是它不必**在要序列化的類的構造函數中。 – 2012-12-18 18:29:30