![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Artiom18 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 9.3.2008 Репутация: нет Всего: нет |
Возник такой вопрос.
Есть класс
И мы его сериализуем, а потом восстанавливаем:
В результате, несмотря на то, что после строк #1 и #2 значения полей index меняются, после десериализации они вновь равны "1" и "2" для line1 и line2 соответственно (как при изначальном создании инстансов). Вопрос, почему это происходит? Это сообщение отредактировал(а) Artiom18 - 10.12.2013, 19:00 |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Потому что: -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Artiom18 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 9.3.2008 Репутация: нет Всего: нет |
LSD, поясните, пожалуйста, тогда процесс.
Мы создаем объект с index = 1.
Первый раз мы записываем в файл его:
Здесь мы теоретически изменили index на 11. Это подтверждает вывод
Я не могу понять, когда мы опять получаем index = 1. При второй записи в файл или уже при десериализации? И на основании чего. P.S. И как тогда можно сохранить измененное поле? Это сообщение отредактировал(а) Artiom18 - 11.12.2013, 10:59 |
||||||||
|
|||||||||
| Artiom18 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 9.3.2008 Репутация: нет Всего: нет |
Кажется понял, в чем дело. Суть в том, что если не закрыть поток ObjectOutputStream перед вторым вызовом, то запишется не новое состояние, а объект из кэша потока.
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
ObjectOutputStream кеширует уже сериализованные объекты в IdentityHashMap. Это деляется для того, чтобы корректно сериализовывать деревья объектов, т.е. если есть два объекта A ссылается на B и B ссылается на A. И мы сериализуем вначале A, потом B, то при десериализации мы получим 2 объекта с взаимными ссылками, а не 4.
В твоем случае это приводит к тому, что второй раз объекты не сериализуются, а просто записывается ссылка на ранее сериализованный объект. Метод reset() решает проблему.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Artiom18 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 9.3.2008 Репутация: нет Всего: нет |
LSD, спасибо за развернутый ответ.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |