Как сериализовать Singleton?

  • 12
  • Недоступна
Два десериализованных объекта singleton и singleton1 имеют разные ссылки в памяти, а должны иметь одинаковые. В класс Singleton добавь один метод, чтобы после десериализации ссылки на объекты были равны. Метод main не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (167)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Vladimir
Уровень 37, Москва, Russian Federation
5 июля, 14:17
Интересно для чего idea подсказывает прописать @Serial в шапке метода? Кстати, валидатор не пропустит, если просто так написать.
[M210] Java Developer
23 июня, 13:03
Провел эксперимент: Создал в классе Singleton переменную String aaa = "aaa"; Перед сериализацией изменил на aaa = "bbb"; Сериализуем класс. Без readResolve() после десериализации, получаем как надо: aaa == "bbb" Идем дальше. Сбрасываем переменную перед десериализацией в null, в методе readResolve() пишем
private Object readResolve() {
        if (ourInstance == null) {
                ourInstance = new Singleton();
           }
           return ourInstance;
        }
Чтобы подсунуть новый объект На выходе видим, что aaa == "aaa" И спрашивается, зачем тогда эти пляски с сериализацией/десериализацей, если мы все равно подсовываем объект из памяти? Я то думал, что всем полям в подсовываемом объекте будут присваиваться значения, считанные на этапе десериализации, но этого не происходит. Все процессы с загрузкой из файла просто идут коту под хвост после подсовывания "своего" объекта Вот еще пример:
private Object readResolve() {
           ourInstance.aaa = "ccc";

            return ourInstance;
        }
На выходе, конечно же получается aaa == "ccc", а не то, что мы записали при сериализации, не "bbb".
MapXyZ
Уровень 34, Минск, Belarus
4 июня, 10:30
Хорошая и краткая статья для понимания. Сериализация Синглтона
Vladimir
Уровень 37, Москва, Russian Federation
5 июля, 14:15
Спасибо. Стало понятнее!
Anonymous #3036451
Уровень 31, Falls Church, United States
17 мая, 07:35
Чисто случайно обнаружил что если вернуть null:
private Object readResolve() {
     return null;
}
то переменные singleton и singleton1 равны null, однако код работает и NPE не выбрасывает 😒
KOTNinja
Уровень 32, Санкт-Петербург, Россия
8 марта, 12:39
Ничего не понял. Решил как болванчик, просто следуя инструкциям, но понимания что это за магия произошла и почему внезапно ссылки стали одинаковыми - нет.
Руслан Косюта
Уровень 34, Калуга, Россия
22 февраля, 09:57
Валидатор не знает еще аннотацию @Serial не добавляйте - минус одна попытка, хоть и добавление аннотации правильнее.
Yuri_S Инженер-конструктор 2к.
10 февраля, 11:30
readResolve надо просто запомнить и отложить в голове Сериализуешь синглтон - вспомни что там есть вот эта вот темная шляпа больше нигде не пригодится
Евгений
Уровень 28, Москва, Russian Federation
5 февраля, 09:53
Я правильно понимаю, что если в Singleton есть значимые поля, то в readResolve() сначала вызываем getInstance() , потом обновляем поля прочитанными из файла данными, а только после этого возвращаем результат?
Юрий
Уровень 20, Киев
22 января, 12:44
Вот это поворот... И при чём здесь
ReadUnshared()
Читать тут !
Михаил Кладовщик с кучей времени
21 января, 11:49
Задача приобретет уровень сложности Эпик, если убрать из условия подсказки про нужный метод.