![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Apr 2006
Сообщений: 85
|
Доброго времени суток
.Стоит задача: сохранить объект - экземпляр класса, а потом восстановить его. Все это с помощью 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. Получается что при восстановлении флеш вызывает конструктор класса без параметров... Я пробовал исключить параметры из конструктора и перенести инициализацию в отдельный метод. В результате после восстановления я получаю объект нужного класса, но с пустыми значениями полей.. Подскажите, пожалуйста, как все-таки можно восстановить объект? |
|
|||||
|
По поводу сохранения экземпляра своего класса:
Цитата:
зы: сделайте get метод, который вам вернет Object из вашего класса и пишите объект. С ними нет проблем. |
|
|||||
|
Регистрация: Apr 2006
Сообщений: 85
|
да, объектом можно это сделать, но, ИМХО, предпологалось что и кастомные классы можно сохранять (или пересылать по сети)..
|
|
|||||
|
Регистрация: Dec 2007
Сообщений: 269
|
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. |
|
|||||
|
Можно сохранять. Но подводных камней там куча. Я не так давно делал сохранение кастомных объектов на сервере. Итак
- все классы объектов, которые ты хочешь сохранять должны реализовывать интерфейс IExternalizable ... Но это еще не все. - если у тебя в востанавливаемом объекте есть объекты других классов и перед востановлением ты закрываешь свф-ку (тоесть востановление происходит не сразу после сохранения) обязательно (!!!) надо перед востановлением сделать экземпляры всех этих объектов. Потому что флеш весьма странно работает. Если ты пытаешся востановить объект какого-то класса, а ни одного экземпляра этого класса не использовалось еще до этого, то вылетает ошибка. Это относится только к пользовательским классам. В хелпе нигде об этом ничего не сказано, и ошибка показывается весьма непонятная. У меня ушла неделя, на то, чтоб разобраться что к чему в этом вопросе. |
|
|||||
|
Регистрация: Apr 2006
Сообщений: 85
|
Спасибо, буду пробовать.. Камней подводных куча, конешн))) Вчера вот разбирался с ExternalInterface и почему он в ие не работает на одной странице. Оказалось что объект находился в форме, а так низзя =).. Хотя в хэлпе не сказано.
|
|
|||||
|
Modus ponens
|
swfformfix.rar
Фикс для форм. Не мое, там вроде внутри написано, кто автор =) ЗЫ. Если форма не результат деятельности АСП (т.е. не оборачивает всю страницу и валидность не важна - можно просто в форму с флешкой вставить еще 1 пустой тег <form> - тоже будет работать =)
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 24.04.2008 в 17:15. |
|
|||||
|
Зачем ExternalInterface. Ты же собирался сохранять в SharedObject.
Badun тебе всё очень чётко ответил. За более подробной информацией обращайся к документации по интерфейсу IExternalizable Там в конце даже пример есть. Почти такой как тебе надо. Если ты не собираешься заморачиваться с этим, то обрати особое внимание на то, что ты можешь сеарилизовать только паблик поля. Не обязательно. Читайте внимательно пост Badun'а. В нем "черным по белому написано", что если вы хотите сохранять private поля, тогда только надо использовать IExternalizable интерфейс. Последний раз редактировалось krolser; 24.04.2008 в 21:17. Причина: Неправильно сослался на другого человека. Дополение. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:44. |
|
|
« Предыдущая тема | Следующая тема » |
|
|