Проблемы с сериализацией векторов в подклассе в AS3

Привет! Я пытаюсь сериализовать данные в AS3, но столкнулся с неприятной проблемой. Первоначально у меня были проблемы с тем, что "myObjClass" не был конвертируемым, но после того, как я обнаружил "registerClassAlias", все стало работать нормально.

Некоторое время спустя я добавил векторы в myObjClass. У меня раньше были проблемы с векторными строками, о чем сообщалось здесь:

https://bugs.adobe.com/jira/browse/FP-6693

Итак, я знаю, что обходной путь должен включать:

registerClassAlias("String", String);

Я просто не уверен, как зарегистрировать псевдоним для подвектора в векторе (вместе с другими переменными). Вот мой код:

var newObj:myObjClass = new myObjClass();
newObj.mySubXML = new Vector.<XML>();
newObj.mySubString = new Vector.<String>();

var myObj:Vector.<myObjClass> = new Vector.<myObjClass>();
myObj.push(newObj);

registerClassAlias("String", String); // Problem #1
registerClassAlias("XML", XML);       // Problem #1
registerClassAlias("VecMyObjClass", Vector.<myObjClass> as Class); // Problem #2
// registerClassAlias("myObjClass", myObjClass); // This and the above are interchangable (same errors)
var bytes:ByteArray = new ByteArray();
bytes.writeObject(myObj);
bytes.position = 0;
myObj = bytes.readObject();

Проблема №1: Когда эти две строки включены в мою компиляцию, последняя строка (bytes.readObject ()) выдает ошибку:

Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@42edb21 to __AS3__.vec.Vector.<myObjClass>.

Это действительно странно. Это как если бы первые два registerClassAlias ​​отменяли третий.

Проблема №2: если я закомментирую две строки «первой проблемы» (строковые / xml-регистрации классов), он отлично преобразует myObj в myObjClass; внутренняя ошибка не возникает, и приложение не останавливается. Однако ему не удается преобразовать внутренние векторы String и XML, и эта ошибка появляется в выводе приложения (без остановки):

TypeError: Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@3aabc11 to __AS3__.vec.Vector.<XML>.
TypeError: Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@3aabc41 to __AS3__.vec.Vector.<String>.

Итак, мой вопрос: как я могу зарегистрировать псевдоним класса для:

  • Вектор. (MyObjClass)
  • Вектор строк как свойство Vector. (MyObjClass)
  • Вектор XML как свойство Vector. (MyObjClass)

Все одновременно?


person Andy Moore    schedule 11.05.2011    source источник


Ответы (3)


Похоже на переезд:

registerClassAlias("XML", XML);
registerClassAlias("String", String);

Into myObjClass напрямую сделал трюк, сохранив при этом:

registerClassAlias("myObjClass", myObjClass);

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

person Andy Moore    schedule 14.05.2011

Если вы хотите использовать сложный векторный контент, вы должны зарегистрировать каждый свой подкласс (для вас Vector. [String]) следующим образом:

    package
{
    import flash.display.Sprite;
    import flash.net.registerClassAlias;
    import flash.utils.ByteArray;

    public class StackOverFlow extends Sprite
    {
        public function StackOverFlow()
        {
            var newObj:myObjClass = new myObjClass();
            newObj.mySubXML = new Vector.<XML>();
            newObj.mySubString = new Vector.<String>();

            var myObj:Vector.<myObjClass> = new Vector.<myObjClass>();
            myObj.push(newObj);

            registerClassAlias("String", String);
            registerClassAlias("XML", XML);
            registerClassAlias("myObjClass", myObjClass);
            registerClassAlias("VecMyObjClass", Vector.<myObjClass> as Class);
            var bytes:ByteArray = new ByteArray();
            bytes.writeObject(myObj);
            bytes.position = 0;
            myObj = bytes.readObject();
        }
    }
}

internal class myObjClass{
    public var mySubXML : Vector.<XML>;
    public var mySubString : Vector.<String>;
}
person Simon Eyraud    schedule 11.05.2011
comment
Хм, если myObjClass - это настраиваемый тип, содержащий два векторных подобъекта, как он будет работать? myObjClass не определяется как vector.string, он определяется как набор свойств; векторная строка, векторный xml, одиночная строка и т. д. - person Andy Moore; 11.05.2011
comment
Как уже говорилось, вы должны зарегистрировать каждый пользовательский тип и каждый используемый вами векторный тип. Вы можете добавить еще код? - person Simon Eyraud; 11.05.2011
comment
Полностью переписал вопрос, чтобы, надеюсь, было больше смысла. :) - person Andy Moore; 14.05.2011
comment
Как сказал drinkycode, вы забыли зарегистрировать myObjClass (извините, drinkycode, я добавил свой ответ одновременно) - person Simon Eyraud; 15.05.2011

Тестируя свой код, Энди, вам нужно зарегистрировать созданный вами класс, чтобы bytes.readObject() возвращал вектор с пользовательскими классами - в данном случае класс myObjClass. Итак, если вы добавите эту строку кода:

registerClassAlias("myObjClass", myObjClass);

Поэтому, если вы измените код, чтобы он выглядел так, вы должны вернуть объект со всеми его данными, правильно сериализованными (я провел простой тест, и он, похоже, работает с моей стороны).

var newObj:myObjClass = new myObjClass();
newObj.mySubXML = new Vector.<XML>();
newObj.mySubString = new Vector.<String>();

var myObj:Vector.<myObjClass> = new Vector.<myObjClass>();
myObj.push(newObj);

registerClassAlias("String", String);
registerClassAlias("XML", XML);
registerClassAlias("myObjClass", myObjClass);
var bytes:ByteArray = new ByteArray();
bytes.writeObject(myObj);
bytes.position = 0;
myObj = bytes.readObject();
person drinkycode    schedule 14.05.2011
comment
Я заменил свой registerAliasClass на ваш (изменив регистрацию с Vector. (MyObjClass) на myObjClass), и я получаю точно такие же результаты - регистрации XML и String приводят к сбою преобразования myObjClass. Когда я их комментирую, он работает нормально (но затем не работает с преобразованием строки + xml). (Добавлена ​​закомментированная строка в Q, чтобы отразить это) - person Andy Moore; 15.05.2011