Проблема сериализации векторов в подклассе в AS3 - PullRequest
4 голосов
/ 11 мая 2011

Привет!Я пытаюсь сериализовать данные в 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>.

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

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

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

Ответы [ 4 ]

6 голосов
/ 15 мая 2011

Похоже на перемещение:

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

В myObjClass напрямую выполнил трюк, сохранив:

registerClassAlias("myObjClass", myObjClass);

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

4 голосов
/ 11 мая 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>;
}
2 голосов
/ 15 мая 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();
1 голос
/ 03 июля 2011
registerClassAlias("String", String);    
registerClassAlias("VecString", Vector.<String> as Class); 

registerClassAlias("XML", XML);    
registerClassAlias("VecXML", Vector.<XML> as Class); 

registerClassAlias("myObjClass", myObjClass);    
registerClassAlias("VecMyObjClass", Vector.<myObjClass> as Class);
...