2010-03-28 6 views
2

Je viens de trouver une erreur étrange lors de la désérialisation d'un ByteArray, où Vector ne peut pas contenir de types qui s'étendent Array: il y a une erreur TypeError lorsqu'ils sont désérialisés.Les sous-classes de tableaux ne peuvent pas être désérialisées, Erreur # 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] 

Voilà comment:

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"; 
} 

Il est un cas assez précis, mais il me semble très étrange. Quelqu'un a-t-il des idées sur ce qui le cause ou comment cela pourrait-il être réparé?

Répondre

2

Bien, il semble que la sérialisation de tableau est codée en dur. vous devriez certainement poster un rapport de bug.

en fait le code que vous avez posté ne jette pas une erreur puisque ba.readObject() as MyArraySubclass est simplement null. MyArraySubclass(ba.readObject()) cependant serait. Ce que vous pourriez essayer de résoudre, serait d'implémenter IExternalizable, même si je ne suis pas sûr que ça marchera mieux.

Je suppose que le problème est que Array est une classe très très spéciale en ActionScript (en ce sens que d'une certaine manière ce n'est rien de plus que toute autre classe dynamique, mais d'une autre manière ce n'est pas du tout) qui conduit à lot de Array -spécifique code dans la machine virtuelle. En outre, une question est, pourquoi avez-vous besoin de sous-classer Array?

+0

Salut, merci pour la réponse. Lorsque vous dites que le code ne génère pas d'erreur, je voudrais signaler qu'il renvoie une erreur de _within_ dans la méthode readObject de ByteArray, et pas seulement dans la classe Application. Donc ce n'est pas le casting que j'ai là qui jette l'erreur, c'est la désérialisation ... tu vois ce que je veux dire? – aaaidan

+0

C'est vraiment bizarre, car il va se désérialiser correctement, tant qu'il n'est pas sérialisé dans un vecteur. Je vais déposer un bug, maintenant vous le mentionnez ... merci pour le support. – aaaidan

Questions connexes