Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сериализация/десириализация объектов, классы которых наследуются от Dictionary (http://www.flasher.ru/forum/showthread.php?t=147635)

Furinax 09.12.2010 18:25

Сериализация/десириализация объектов, классы которых наследуются от Dictionary
 
В общем, не получается :)

Пример кода:

Класс:
Код AS3:

package testPack
{
        import flash.net.registerClassAlias;
        import flash.utils.Dictionary;
        import flash.utils.IDataInput;
        import flash.utils.IDataOutput;
        import flash.utils.IExternalizable;
 
        [RemoteClass(alias="testPack.Test")]
        public dynamic class Test extends Dictionary implements IExternalizable
        {
 
                protected var tested:Boolean = false;
 
                public function Test(weakKeys:Boolean = false):void
                {
                        super(weakKeys);
                        registerClassAlias("flash.utils.Dictionary", Dictionary);
                        registerClassAlias("testPack", Test);
                }
 
                public function readExternal(input:IDataInput):void
                {
                        tested = input.readBoolean();
                        trace("READ:");
                        trace("tested = " + tested);
                }
 
                public function writeExternal(output:IDataOutput):void
                {
                        output.writeBoolean(tested);
                        trace("WRITE:");
                        trace("tested = " + tested);
                }
        }
}

Тестовый пример использования:

Код AS3:

var test1:Test = new Test();
trace(test1)// [object Test]
 
var bytes:ByteArray = new ByteArray();
bytes.writeObject(test1);
bytes.position = 0;
 
var test2:Test = bytes.readObject() as Test;
bytes.position = 0;
trace(test2); // null

Гуглил, ничего не нашел.

Заранее спасибо за ваше потраченное время.

-De- 09.12.2010 18:54

Не всё сериализируется/рассериализируется тупо через writeObject/readObject, что могу сказать, например ещё
http://www.flasher.ru/forum/showthre...sterClassAlias
IExternalizable не про writeObject/readObject, его, как я понял, используют где-то так:
Код AS3:

var test1:Test = new Test();
trace(test1)// [object Test]
 
var bytes:ByteArray = new ByteArray();
test1.writeExternal(bytes);
bytes.position = 0;
 
var test2:Test = new Test();
bytes.position = 0;
test2.readExternal(bytes);
trace(test2); // null


Furinax 09.12.2010 19:07

Думаю явно не так, хоть и не пробовал его так использовать.
Дело в том, что для правильной сериализации/десиреализаци комплексных объектов (записи в массив байтов) - необходимо, чтобы они имплементили интерфейс IExternalizable, о чем и сказал wvxvw в этой теме http://www.flasher.ru/forum/showthre...sterClassAlias.
В общем я делал так, и все всегда получалось. А вот теперь наткнулся на класс, который наследуется от Dictionary и застрял, так как из-з этого почему-то не работает. Хотя по идее в методах ByteArray writeObject() и readObject() должна делаться проверка на то, реализует ли объект интерфейс IExternalizable, а тут возникает такое чувство, что она не выполняется.

cleptoman 09.12.2010 19:15

без приведения посмотрите - читает что-либо или нет.
Код AS3:

trace(bytes.readObject());


Furinax 09.12.2010 19:26

Без приведения получается просто [object Dictionary]. Ну оно и правильно, что просто Dictionary. У меня расставленны трейсы в методах readExternal и writeExternal у класса, который наследуется от него, и они молчат.
Проблемма именно в классах, которые наследуется от Dictionary. так как я пробовал наследоваться и от Object, и от EventDispatcher. И все работает. А от Dictionary нет.

Rzer 09.12.2010 19:40

Попробуйте регистрировать свой класс, через flash.net.registerClassAlias(). То, что для хранения объектов в SharedObject (где используется AMF) регистрировать свой класс надо - я знаю, а вот для ByteArray..

UPD: нужно - вот: http://blog.webdeely.com/2009/03/sto...-for-air-apps/

Furinax 09.12.2010 19:59

В написанном мною примере тестового класса - он регистрирует себя с помощью registerClassAlias() в констрокторе, причем регистрирует не только себя, но и Dictionary, от которого наследуется и все равно ен помогает. http://blog.webdeely.com/2009/03/sto...-for-air-apps/ - это я уже читал, там не для Dictionary, в таких случаях и у меня все ок. Попробуйте в примере, который я выложил заменить Dictionary на Object или EventDispatcher и все заработает.

cleptoman 09.12.2010 20:14

Код AS3:

registerClassAlias("testPack.Test", Test);

не?

Furinax 09.12.2010 22:50

не :)
Если повнимательней посмотреть код, который я выложил - там эта строчка есть.

Я еще много раз написал до этого, что все дело именно в Dictionary, если наследоваться от других классов - все работает.
Я уже склонен верить, что это баг флэш плэера.

Надеюсь кто-нибудь знающий объянит в чем дело и почему так.

Psycho Tiger 09.12.2010 23:08

Меня слегка напрягает что алиас регистрируется в классе что сериализуется. Это нормальная практика?


Часовой пояс GMT +4, время: 10:38.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.