2010-03-28 61 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