Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Десериализация: зачем нужен пустой конструктор? 
V
    Опции темы
COVD
Дата 2.3.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Я нашёл ссылку. В ней написано, что это НЕ ТАК. Конструктор без параметров не нужен, что подтверждается тем, что ошибка сохранилась тогда, когда я такой конструктор создал.

Да. Я по аналогии с xml сериализацией рассуждал. Спасибо!
PM MAIL   Вверх
chand0s
Дата 4.3.2009, 11:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.2.2007

Репутация: 1
Всего: 3



Для общего развития

В Java есть 2 способа сделать объект сериализуемым: Serializable и Externalizable
1) Serializable
При сериализации: определяются поля, которые сериализуются, , значения этих полей вычитываются через reflection и записываются в выходной поток.
При десериализации: под объект выделяется место в памяти, и в эту память записываются значения из потока. Конструктор объекта не вызывается.
Какие поля сериализуются/не сериализуются: поля static и transient не сериализуются. Все остальные сериализуются. Немного отдельно стоит механизм с объявлением в классе переменной serialPersistentFields.

2) Externalizable

При сериализации: управление передается методу writeExternal сериализуемого объекта. Что писать в поток - решает сам объект.
При десериализации: создается экземпляр объекта с помощью дефолтного конструктора и вызывается метод readExternal, который вычитывает данные из потока и присваивает значения своим полям.
Какие поля можно сериализовать - а какие угодно. Вы сами это решаете в методе writeExternal.

Некоторые выводы:
1) Для реализации Serializable наличие/отсутствие каких-либо конструкторов роли не играет. Для Externalizable нужен дефолтный public-конструктор (без параметров)
2) Serializable нормально сериализует/десериализует final-поля. Externalizable этого не умеет.
3) В случае Serializable static и transient поля не сериализуются. В случае Externalizable можно записать в поток все что угодно.
4) Если класс одновременно реализует Serializable и Externalizable интерфейсы - "победит" Externalizable

Некоторые плюсы и минусы Externalizable:
Плюс: скорость сериализации/десериализации и свобода обращения с данными.
Минус: нарушение связности графа сериализуемых объектов (точнее, не нарушение, а необходимость самому за этим следить)

Есть еще ряд интересных ньюансов, но что-то пост длинный слишком получается  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.