Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не получается корректно сериализовать объект (http://www.flasher.ru/forum/showthread.php?t=111036)

chudesno 14.04.2008 18:43

Не получается корректно сериализовать объект
 
Доброго времени суток :).
Стоит задача: сохранить объект - экземпляр класса, а потом восстановить его. Все это с помощью SharedObject.

Вот класс объекта, который пытаюсь сохранить:

Код:

package model
{
        public class Person        {
                private var _firstName : String;
                private var _age : int;
               
                public function Person (firstName : String, age : int) {
                        _firstName = firstName;
                        _age = age;
                }
               
                public function toString () : String {
                        return _firstName + _age + " years";
                }
        }
}

А вот код, которым все это дело и должно сохраняься (но нет :))

Код:

package
{
        import flash.net.registerClassAlias;
        import model.Person;
        import flash.net.SharedObject;
       
        public class Example {
                public function Example () {
                        registerClassAlias("model.Person", Person);
                        var example : SharedObject = SharedObject.getLocal("example");
                        if (example.data.person == undefined) {
                                trace ("first time");
                                var person : Person = new Person ("Derron", 24);
                                example.data.person = person;
                               
                        } else {
                                trace ("it is already saved");
                        }
                        trace (example.data.person.toString());
                }
        }
}


Когда идет попытка восстановить объект, плеер выкидывает ошибку с тем, что ожидалось 2 параметра в конструкторе класса Person, а получено 0. Получается что при восстановлении флеш вызывает конструктор класса без параметров...
Я пробовал исключить параметры из конструктора и перенести инициализацию в отдельный метод. В результате после восстановления я получаю объект нужного класса, но с пустыми значениями полей..

Подскажите, пожалуйста, как все-таки можно восстановить объект?

ulik 14.04.2008 19:47

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

data:Object [read-only]
Language Version : ActionScript 3.0
Player Version : Flash Player 9
The collection of attributes assigned to the data property of the object; these attributes can be shared and stored. Each attribute can be an object of any ActionScript or JavaScript type — Array, Number, Boolean, ByteArray, XML, and so on.
"Object of any AS" - видимо, имеют ввиду стандартные...

зы: сделайте get метод, который вам вернет Object из вашего класса и пишите объект. С ними нет проблем.

chudesno 15.04.2008 12:52

да, объектом можно это сделать, но, ИМХО, предпологалось что и кастомные классы можно сохранять (или пересылать по сети)..

badun 15.04.2008 13:37

If a class does not implement, nor inherits from a class which implements, the IExternalizable interface, then an instance of the class will be serialized using the default mechanism of public members only. As a result, private, internal, and protected members of a class will not be available.

To serialize private members, a class must use the IExternalizable interface.

NePridymal 17.04.2008 19:28

Можно сохранять. Но подводных камней там куча. Я не так давно делал сохранение кастомных объектов на сервере. Итак
- все классы объектов, которые ты хочешь сохранять должны реализовывать интерфейс IExternalizable ... Но это еще не все.
- если у тебя в востанавливаемом объекте есть объекты других классов и перед востановлением ты закрываешь свф-ку (тоесть востановление происходит не сразу после сохранения) обязательно (!!!) надо перед востановлением сделать экземпляры всех этих объектов. Потому что флеш весьма странно работает. Если ты пытаешся востановить объект какого-то класса, а ни одного экземпляра этого класса не использовалось еще до этого, то вылетает ошибка. Это относится только к пользовательским классам. В хелпе нигде об этом ничего не сказано, и ошибка показывается весьма непонятная. У меня ушла неделя, на то, чтоб разобраться что к чему в этом вопросе.

chudesno 24.04.2008 15:49

Спасибо, буду пробовать.. Камней подводных куча, конешн))) Вчера вот разбирался с ExternalInterface и почему он в ие не работает на одной странице. Оказалось что объект находился в форме, а так низзя =).. Хотя в хэлпе не сказано.

wvxvw 24.04.2008 17:09

Вложений: 1
Вложение 19366
Фикс для форм. Не мое, там вроде внутри написано, кто автор =)

ЗЫ. Если форма не результат деятельности АСП (т.е. не оборачивает всю страницу и валидность не важна - можно просто в форму с флешкой вставить еще 1 пустой тег <form> - тоже будет работать =)

krolser 24.04.2008 20:41

Зачем ExternalInterface. Ты же собирался сохранять в SharedObject.
Badun тебе всё очень чётко ответил.

За более подробной информацией обращайся к документации по интерфейсу IExternalizable
Там в конце даже пример есть. Почти такой как тебе надо.

Если ты не собираешься заморачиваться с этим, то обрати особое внимание на то, что ты можешь сеарилизовать только паблик поля.

Цитата:

Сообщение от NePridymal (Сообщение 733797)
Можно сохранять. Но подводных камней там куча. Я не так давно делал сохранение кастомных объектов на сервере. Итак
- все классы объектов, которые ты хочешь сохранять должны реализовывать интерфейс IExternalizable ... Но это еще не все.

Не обязательно. Читайте внимательно пост Badun'а. В нем "черным по белому написано", что если вы хотите сохранять private поля, тогда только надо использовать IExternalizable интерфейс.


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

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