где и как вызывается метод readResolve() и класс Singleton имеет только одно поле объект Singleton при сохранении в ByteArrayOutputStream что мы именно храним? ведь команда new Singleton это выделение памяти в куче то есть мы храним в ByteArrayOutputStream адрес памяти?
Zhandos
32 уровень
как
Обсуждается
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3303140
10 апреля, 08:57
1. readObject() вызывает readResolve() через рефлексию
Смотри ответ Ксении тут: https://javarush.com/help/63701
https://docs.oracle.com/javase/7/docs/platform/serialization/spec/input.html#5903
2. Нет, адрес мы не храним. Суть сериализации заключается в том, что ты сохраняешь информацию о типе объекта и о состоянии его сериализуемых полей. Эту информацию ты можешь сохранить в базе данных, в файле на диске и т.д. Главное, что при десериализации, когда ты читаешь эту информацию, у тебя должен получиться точно такой же объект, как был до сериализации. Ты же можешь в один запуск программы выполнить сериализацию, в другой - десериализацию. В другом запуске твой объект синглтона будет существовать по другому адресу, и обращение по сохранённому адресу ничего бы не дало. Вместо этого, ты просто воссоздаёшь свой объект синглтона, обращаясь к методу getInstance(). А вся сохранённая информация - это информация о классе Solution.Singleton, которая говорит о том, объект какого класса должен создать метод readObject. Если бы в синглтоне было бы какое-нибудь ещё поле, допустим, int count, то оно бы тоже было сериализовано, а в десериализации надо было бы позаботиться о том, чтобы создаваемому объекту было присвоено то же самое значение.
3. По сути главная особенность сериализации синглтона состоит в том, что нужно не допустить создания нового экземпляра при десериализации - иначе это нарушит саму концепцию синглтона. Вместо этого нужно взять уже имеющийся инстанс при помощи getInstance() - и воссоздать сериализованное его состояние (если у синглтона были другие поля - то присвоить им значения из сериализованного объекта). В данном случае полей нет, поэтому при десериализации мы просто возвращаем имеющийся инстанс синглтона - он всегда одинаковый.
0