Два десериализованных объекта singleton и singleton1 имеют разные ссылки в памяти, а должны иметь одинаковые.
В класс Singleton добавь один метод, чтобы после десериализации ссылки на объекты были равны.
Метод main не участвует в тестировании.
Как сериализовать Singleton?
- 12
Недоступна
Комментарии (167)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Vladimir
5 июля, 14:17
Интересно для чего idea подсказывает прописать @Serial в шапке метода? Кстати, валидатор не пропустит, если просто так написать.
0
[M210] Java Developer
23 июня, 13:03
Провел эксперимент:
Создал в классе Singleton переменную String aaa = "aaa";
Перед сериализацией изменил на aaa = "bbb";
Сериализуем класс.
Без readResolve() после десериализации, получаем как надо: aaa == "bbb"
Идем дальше.
Сбрасываем переменную перед десериализацией в null,
в методе readResolve() пишем
Чтобы подсунуть новый объект
На выходе видим, что aaa == "aaa"
И спрашивается, зачем тогда эти пляски с сериализацией/десериализацей, если мы все равно подсовываем объект из памяти? Я то думал, что всем полям в подсовываемом объекте будут присваиваться значения, считанные на этапе десериализации, но этого не происходит. Все процессы с загрузкой из файла просто идут коту под хвост после подсовывания "своего" объекта
Вот еще пример:
На выходе, конечно же получается aaa == "ccc", а не то, что мы записали при сериализации, не "bbb".
0
MapXyZ
4 июня, 10:30
Хорошая и краткая статья для понимания.
Сериализация Синглтона
+4
Vladimir
5 июля, 14:15
Спасибо. Стало понятнее!
0
Anonymous #3036451
17 мая, 07:35
Чисто случайно обнаружил что если вернуть null:
![]()
то переменные singleton и singleton1 равны null, однако код работает и NPE не выбрасывает 😒

0
KOTNinja
8 марта, 12:39
Ничего не понял. Решил как болванчик, просто следуя инструкциям, но понимания что это за магия произошла и почему внезапно ссылки стали одинаковыми - нет.
+11
Руслан Косюта
22 февраля, 09:57
Валидатор не знает еще аннотацию @Serial не добавляйте - минус одна попытка, хоть и добавление аннотации правильнее.
+2
Yuri_S Инженер-конструктор 2к.
10 февраля, 11:30
readResolve надо просто запомнить и отложить в голове
Сериализуешь синглтон - вспомни что там есть вот эта вот темная шляпа
больше нигде не пригодится
+1
Евгений
5 февраля, 09:53
Я правильно понимаю, что если в Singleton есть значимые поля, то в readResolve() сначала вызываем getInstance() , потом обновляем поля прочитанными из файла данными, а только после этого возвращаем результат?
0
Юрий
22 января, 12:44
Вот это поворот... И при чём здесь
тут !
Читать 0
Михаил Кладовщик с кучей времени
21 января, 11:49
Задача приобретет уровень сложности Эпик, если убрать из условия подсказки про нужный метод.
+6