2010-03-28 54 views
2

ByteArray反序列化時,我發現了一個奇怪的錯誤,其中Vector s不能包含擴展的類型Array:它們在反序列化時存在TypeError。數組子類無法反序列化,錯誤#1034

TypeError: Error #1034: Type Coercion failed: cannot convert []@4b8c42e1 to com.myapp.ArraySubclass. 
    at flash.utils::ByteArray/readObject() 
    at com.myapp::MyApplication()[/Users/aaaidan/MyApp/com/myapp/MyApplication.as:99] 

下面的方式:它

public class Application extends Sprite { 
    public function Application() { 
     // register the custom class 
     registerClassAlias("MyArraySubclass", MyArraySubclass);   

     // write a vector containing an array subclass to a byte array 
     var vec:Vector.<MyArraySubclass> = new Vector.<MyArraySubclass>(); 
     var arraySubclass:MyArraySubclass = new MyArraySubclass(); 
     arraySubclass.customProperty = "foo"; 
     vec.push(arraySubclass); 

     var ba:ByteArray = new ByteArray(); 
     ba.writeObject(arraySubclass); 
     ba.position = 0; 

     // read it back 
     var arraySubclass2:MyArraySubclass = ba.readObject() as MyArraySubclass; // throws TypeError 
    } 
} 

public class MyArraySubclass extends Array { 
    public var customProperty:String = "default"; 
} 

是一個非常特殊的情況下,但它似乎很奇怪我。任何人有任何想法是什麼導致它,或如何解決它?

回答

2

好吧,看來陣列序列化是硬編碼的。你一定要發佈一個錯誤報告。

實際上您發佈的代碼不會引發錯誤,因爲ba.readObject() as MyArraySubclass只是null。然而,MyArraySubclass(ba.readObject())會。

你可以嘗試解決它,將執行IExternalizable,儘管我不確定它會更好。

我想問題是Array是ActionScript中非常非常特殊的類(從某種意義上說,它只不過是其他任何動態類,而在其他方面根本不是),這導致了很多Array-VM中的特定代碼。另外,一個問題是,爲什麼你需要子類Array

+0

嘿,謝謝你的回答。當你說代碼沒有拋出錯誤時,我想指出它會拋出ByteArray的readObject方法中的錯誤,而不僅僅是來自Application類。所以這不是我在那裏拋出的那個投擲錯誤,這是反序列化......你知道我的意思嗎? – aaaidan 2010-03-29 23:58:25

+0

這真的很奇怪,因爲它會反序列化,只要它沒有在Vector中序列化。我會提出一個錯誤,現在你提到它......感謝支持。 – aaaidan 2010-03-30 00:07:18