Serializable Solution

  • 12
  • Недоступна
У нас есть класс Solution, идем его сериализовать. Подумайте, какие поля не нужно сериализовать, пометь ненужные поля модификатором transient. Объект всегда должен содержать актуальные итоговые данные.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (105)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Vlad27 уровень
23 June, 18:07
Подумай, какие поля не нужно сериализовать, пометь ненужные поля модификатором transient. • Поле pattern должно быть отмечено модификатором transient. • Поле currentDate должно быть отмечено модификатором transient. • Поле temperature должно быть отмечено модификатором transient. Кажется, я понял..
15 June, 11:28
В чём соль JavaRush? Можно просто поставить на нужные поля модификатор transient, и валидацию пройдёт. Зачем же тогда писать это:
 
Написать код проверки самостоятельно в методе main:
1) создать файл, открыть поток на чтение (input stream) и на запись(output stream);
2) создать экземпляр класса Solution - savedObject;
3) записать в поток на запись savedObject (убедитесь, что они там действительно есть);
4) создать другой экземпляр класса Solution с другим параметром;
5) загрузить из потока на чтение объект - loadedObject;
6) проверить, что savedObject.string равна loadedObject.string;
7) обработать исключения.
Вышеуказанные поля СОВСЕМ НЕ обязательно исполнять. Или я задание не понял или что-то с сервисом не так. Честно говоря, кстати, совсем не понимаю, что должен написать в main()-е. Если не сложно - объясните.
VincitQuiPatitur22 уровень, Санкт-Петербург
Friday, 12:55
Тоже не поняла этот момент. Написано "Написать код проверки самостоятельно в методе main:", а строчкой выше "Метод main не участвует в тестировании.". Ну, вы напишите, но мы проверять не будем :)
Jean Valjean26 уровень
14 June, 21:18
Что в коде такого, что в в созданном файле иероглифы?
Vad23 уровень
23 June, 17:51
Там куча служебной инфы записывается в байткоде. Вот здесь хорошие статьи: https://m.habr.com/ru/post/60317/ http://www.skipy.ru/technics/serialization.html
John Preston24 уровень, Киев
26 April, 12:03
интересно что если финальное поле private final String pattern пометить модификатором transient, то все равно это поле сериализируется(можно прочитать его с десериализированного обьекта) т.е. как по мне нет смысла помечать его transient, но без этого валидацию не проходит мб кто-то подскажет в чем подвох?
barracuda25 уровень, Санкт-Петербург
3 May, 21:03
Мне кажется, подвох вот в чем: private final String pattern объявляется и сразу же инициализируется. Поскольку она final, то изменить ее значение уже не получится. И у каждого объекта она будет одинакова - именно такая, как определена в самом начале. поэтому, можно, конечно, её сериализовать, но необходимости в этом нет.
John Preston24 уровень, Киев
5 May, 00:25
во первых я не совсем понимаю почему это поле сериализируется, если его пометить transient ведь сериализация через Serializable происходит через рефлексию и конструктор класса Solution не вызывается(соответственно даное поле не инициализируется) во вторых я не понимаю почему валидатор хочет чтобы мы пометили это поле модификатором transient, если по сути это ничего не меняет (если поле пометить transient то все равно оно отлично сериализируется и десереализируется)
Алексей Иванов22 уровень, Cheboksary
5 June, 08:48
Видимо, дело в том, что это поле не сериализуется, если его пометить transient. Оно инициализируется при создании объекта во время десериализации. Да конструктор не вызывается, но final поле и не в нём инициализируется. Можете заглянуть в тот файл, который вы использовали для сериализации и сравнить его состояние при помеченном transient поле pattern и без.
Алексей Чумаков28 уровень, Ногинск
7 June, 11:04
непонятен сам механизм сериализации. Transient (нерезидент) — модификатор полей класса в языке Java. Отмеченные этим модификатором поля не записываются в поток байт при применении стандартного алгоритма сериализации. При десериализации объекта такие поля инициализируются значением по умолчанию. Подробнее: http://cyclowiki.org/wiki/Transient_(Java) если поля не записываются в поток байт, то как вообще происходит восстановление полей, которые помеченных как transient. Затем сразу же идёт строка: При десериализации объекта такие поля инициализируются значением по умолчанию. Вопрос: если поля не были записаны в поток байт, то как вообще про них можно узнать при десериализации если их нет в этом потоке байт. Короче какая-то мутная тема).
Евгений27 уровень, Санкт-Петербург
8 June, 10:11
Как уже написали выше, это поле не сериализуется, в этом примере поле pattern является compile-time constant. Можно проверить, если сохранить объект, потом изменить в классе поле pattern и загрузить его снова, поле pattern, если оно по прежнему будет String, будет от текущей версии класса.
Алексей Чумаков28 уровень, Ногинск
8 June, 10:23
Всё понял спасибо. Я только сейчас понял, что мы можем десериализовать только тот класс который мы знаем.т.к. , когда мы десериализуем объект мы под него выделяем память под уже известный класс и кастим. Сбило с толку, что там Reflection API используется, а им по идее можно вызывать объекты про которые ничего не известно
Kex34 уровень, Тольятти
17 April, 09:55
Тот момент когда думаешь что накодил ерунду и отправляешь на проверку для просмотра ошибок, а валя съел, вот лучше бы получалось тогда когда ждешь что все ок!
Кирилл23 уровень, Москва
27 May, 11:12
Аналогично! Написал что-то на скорую руку. Клацнул на проверку, раз и прошло проверку... Редко такое бывает. ))
Юрий25 уровень, Калининград
3 April, 15:18
При тестировании, если вылетает исключение EOFException, то... EOFException = EOF+Exception = End Of File Exception исключение которое случается когда файл прочитал весь, но попытки считывать продолжаются... Поэтому сначала ObjectOutputStream, а потом ObjectInputStream!
Павел Краснов22 уровень, Архангельск
30 March, 18:25
Задаче минус, Комментариям плюс! 😀
Igor25 уровень, Санкт-Петербург
24 January, 09:03
Модификатор transient действует только на стандартный механизм сериализации Serializable. При использовании Externalizable никто не мешает сериализовать это поле. http://java-online.ru/blog-serialization.xhtml
Igor25 уровень, Санкт-Петербург
15 January, 10:57
Подскажите, когда загружаем объект , loadedObject ( Date , pattern ,temmperature transient) каким образом присваивается значение temperature к loadedObject ? почему оно не 0? ведь transient поля должны стать значениями по умолчанию ? ------------------ Это значит что из данной строки вытаскиваются все значения string = "Today is %s, and the current temperature is %s C"; this.string = String.format(string, format.format(currentDate), temperature); но как ???
Тот кто в танке28 уровень, Ярославль
22 January, 10:16
а оно не вытаскивается, в файл пишется только лишь строка, в которую температура забита. При попытке посмотреть поле temperature увидите 0.
Igor25 уровень, Санкт-Петербург
22 January, 12:38
System.out.println(savedObject.temperature == loadedObject.temperature); true
Тот кто в танке28 уровень, Ярославль
22 January, 14:01
у меня с такой же строкой false. Можете код в личку бросить поглядеть?
Igor25 уровень, Санкт-Петербург
24 January, 09:01
Модификатор transient действует только на стандартный механизм сериализации Serializable. При использовании Externalizable никто не мешает сериализовать это поле. http://java-online.ru/blog-serialization.xhtml
KN25 уровень, Москва
9 January, 13:27
Каждый раз, когда вижу в условиях "Подумай, что надо сделать/какой модификатор поставить и пр." , отключаю логику, чтоб не сломалась и сразу иду в требования. И даже не пытайтесь понять, в чем актуальность строки по отношению исходным значениям)