Подклассы массива не могут быть десериализованы, Ошибка № 1034 - PullRequest
2 голосов
/ 29 марта 2010

Я только что обнаружил странную ошибку при десериализации из ByteArray, где Vector s не может содержать типы, расширяющие Array: при десериализации существует ошибка TypeError.

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

Это довольно специфический случай, но он кажется мне очень странным. У кого-нибудь есть идеи, что его вызывает или как это можно исправить?

1 Ответ

2 голосов
/ 29 марта 2010

ну, похоже, сериализация массива жестко запрограммирована. Вы обязательно должны опубликовать отчет об ошибке.

фактически код, который вы разместили, не выдает ошибку, поскольку ba.readObject() as MyArraySubclass это просто null. MyArraySubclass(ba.readObject()) однако будет.

Что бы вы могли попытаться исправить, это реализовать IExternalizable, хотя я не уверен, что это будет работать лучше.

Полагаю, проблема в том, что Array - это очень особенный класс в ActionScript (в том смысле, что в некотором смысле это не что иное, как любой другой динамический класс, но в других отношениях это совсем не так), что приводит к много Array -специфичного кода в ВМ. Также вопрос в том, зачем вам подкласс Array?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...