Небольшая поправка на 2022 год. Опция Serializable теперь находится не в Java/Serialization issues. Теперь она чуть ниже в JVM Languages. Ну а вообще поиск по настройкам всем в помощь на все времена))
Очень грамотный учитель. Столько терпения и самопожертвования нужно, чтобы делиться бесплатно такими знаниями в ютуб, если учитывать тот факт, что полезный контент редко бывает особо популярным и приносит мизерные доходы
th-cam.com/video/nr4_JRKCGBU/w-d-xo.html Один нюанс для новых версий IntelliJ IDEA: галочка "Serializable class whithout 'serialVersionUID' находится теперь в группе "JVM languages"
как можно до этого догадаться? я пол часа потратил на поиски "Serializable class whithout 'serialVersionUID' чтобы поставить галочку в нужном месте? как в этом во всём разобраться?
Я поставил все галочки по настройкам старых версий, не помогло...в недоумении полез за инфой на англоязычные форумы. Все тоже самое и только один человек написал про поиск "Ctrl + Shift + A". Там ввел Serializable и из всех вариантов по логике выбрал нужное )
Интересная особенность работы transient. 1. Если поле пометить transient 2. Затем записать объекты в файл 3. Теперь убрать ключевое слово transient 4. А теперь прочитать объекты из файла То окажется, что поля которые в момент записи были под запретом сериализации на самом деле были записаны в файл и теперь будут доступны при чтении из файла.
Автор на 12:27 говорит, что если класс реализует интерфейс Closable, то его можно использовать в try with resourses. Наверное надо сказать, что этот механизм реализован благодаря интерфейсу Autoclosable.
@@manOfPlanetEarth До сих пор изучаю Java) Сейчас только на многопоточности. Каждый день трачу как минимум 4 часа. Но, если честно, то сильно замедлило обучение обстоятельства в жизни. Из-за них я пару дней пропустил, и несколько дней уделил только 1-2 часа на обучение(это очень мало). Сейчас уже проблем нет, и я снова активно изучаю. Немного раздражает то, что авторы уроков иногда упускают очень важные детали, или пропускают половину методов класса. И приходится самому изучать на практике, или долго гуглить объяснения. Хотя, практика веселее.
Небольшая поправка, для использования класса в try-with-resources он должен реализовывать интерфейс AutoCloaseble. Но и Cloaseble достаточно, т.к. он сам наследуется от AutoCloaseble
Поправьте, если не прав. Но, что в предыдущих уроках по сериализации, что в этом, неправильно закрывать поток в блоке try{}, т.к. если вылетит ошибка то мы просто не дойдем до метода close() и поток не закроется. Без использования try с ресурсами закрытие потоков необходимо осуществлять в блоке finally{}. Ну, и про это уже вроде писали, класс должен реализовывать интерфейс Autocloseable для возможности закрывать его автоматически в блоке try с ресурсами, а не Closeable.
Один нюанс для новых версий IntelliJ IDEA: галочка "Serializable class whithout 'serialVersionUID' находится теперь в группе "JVM languages" как можно до этого догадаться? я пол часа потратил на поиски "Serializable class whithout 'serialVersionUID' чтобы поставить галочку в нужном месте? как в этом во всём разобраться?
SerialVersionUID нужно использовать перед, тем как собрался класс менять, чтоб те объекты, которые были созданы на основе старого класса идентифицировались? Можно ли создавать несколько SerialVersionUID, чтоб сохранить несколько состояний? При возникновении исключении try with resource в методе .close(), какое исключение подавляется?
так как ObjectInputStream оборачивает FileInputStream, нам достаточно закрыть только ObjectInputStream. Когда "класс-поток" оборачивает другие "классы-потоки", достаточно закрыть самый внешний, все внутренние закроются автоматически.
например есть несколько систем которые обмениваются объектами в какой то момент формат объекта изменился, и его нужно, например, синхронно изменить во всех системах если какая то система будет присылать старый формат то приемник не даст загрузить старые данные
@@Das.Kleine.Krokodil Просто и без него(serialVersionUID) оно так же закрашится. И покажет в консоле, что у тебя serialVersionUID отличается, если как Наиль ты поле поменял к примеру. Я тоже не вижу практического примения пока что. Что с ним, что без него краш одинаковый.
@@Das.Kleine.Krokodil private static final long serialVersionUID = -4285536860777108864L; /* без него выбъет при изменении в классе ошибку: Caused by: java.io.InvalidClassException: NeilCourse.Serialization.Person3; local class incompatible: stream classdesc serialVersionUID = -4285536860777108864, local class serialVersionUID = 8703533545316993911 А с ним запустит старую версию даже при добавленом поле в класс Person. Я протестил. + (просто констатация того что в видео) если если добавить выше как показал в видео Наиль новую serialVersionUID выбъет тогда в этом случае также описанную выше ошибку*/
@@Das.Kleine.Krokodil И также еще такую штуку заметил: Если изменим имя поля или дадим ему non-access modifier transient, а serialVersionUID оставим старым = то вывод этого поля будет равняться дефолту null или 0 в зависимости от типа поля. !!!
Вопрос. Есть рабочая, не сериализуемая переменная, которая в конструкторе устанавливается в -1. Но после реализации она будет равна 0. Конструктор запускаться не будет при этом. И всё сломается. Есть ли возможность "дать понять" классу, что он только что вышел из бинарного состояния, и было бы неплохо запустить некую предстартовую инициализацию рабочих переменных? Или нужно это делать каждый раз ручками после десериализации?
Для этого можно определить методы: private void readObject(InputStream in) и private void writeObject(OutputStream out) для чтения и записи соответственно, внутри них нужно вызвать дефолтные методы для чтения и записи: defaultReadObject(in); и defaultWriteObject(out); а уже после них присвоить необходимые значения полям или вызвать заранее написанную для этого функцию. При сериализации/десериализации сначала произойдет проверка на существование методов приведенных в самом начале комментария в твоём классе и если они существуют - они будут вызваны вместо дефолтных. Также можно имплементировать интерфейс Externalizible и написать соответствующие методы полностью руками. В таком случае сериализацию можно настроить ещё гибче
не понял только 1ого. Если я запустил Write с 2 параметрами в конструктуре , и через 5 лет класс поменялся и сменился SerialVersionuuID , то я ни как не прочитаю уже тот обьект что сохранил 5 лет назад ? мне вылетит эта ошибка с сериалВерсион , и всё ? Можно удалить тот сохранёный обьект , как буд то его и не было ? По идее звучит , как будто " я больше не твой бро , иди ищи другого , с тобой я не связан больше" ... типо другая программа вобще полуается ведь
SerialVersionuuID наверное создан, чтобы ты не пудрил себе мозги, когда вылетит какая-то ошибка связанная с разностями класса. Ты просто увидел, что объект старый, версии класса не совпадают и все
это сделано чтобы была согласованность данных, чтобы нельзя было частично загрузить данные и нарушить поведение программы если есть потребность загрузить старые версии объектов, то или программа должна поддерживать такую возможность или нужно использовать старые версии программы для загрузки тут зависит от целей, и вообще откуда взялся файл со старой версией может это ошибка программиста, что прислал тебе неактуальную структуру может быть вчера обновляли несколько систем, а одну не обновили и от нее идет не та версия
после 1 записи в файл, когда 1: Mike мы записали и считали этот файл. заменили поля класса person(НО не перезаписывали в файл), т.е в файле все еще находятся данные 1:Mike почему после смены serialVersion мы не можем считать??
Регистрируйтесь на курс "Продвинутая Java": th-cam.com/video/rRe1vT0SDD8/w-d-xo.html
Практикуйтесь в написании Java кода: java-marathon.tilda.ws
Небольшая поправка на 2022 год. Опция Serializable теперь находится не в Java/Serialization issues. Теперь она чуть ниже в JVM Languages. Ну а вообще поиск по настройкам всем в помощь на все времена))
спасибо большое. 20 минут убил на метод проб и ошибок, потом плюнул и только потом догадался в комментах глянуть
Спасибо, тоже долго искал!
@@ИгорьВоронов-ъ4м как успехи?
@@blackteam5273 норм. Хотя смотря о чем ты
@@ИгорьВоронов-ъ4м успехи в программировании
Смотрю этот урок в 2022 году. С 2017го как раз "прошло 5 лет"
ахахахха
@@thierryguetta-b6t cмеется тот кто смеется последним!
ахахаха
Да
2024
00:00 Transient
03:54 serialVersionUID
10:08 try with resources
Очень грамотный учитель. Столько терпения и самопожертвования нужно, чтобы делиться бесплатно такими знаниями в ютуб, если учитывать тот факт, что полезный контент редко бывает особо популярным и приносит мизерные доходы
Вернее сказать специализированный контент редко бывает популярным
Привет, 3 года прошло с момента твоего комментария. на какой сейчас позиции? Или забросил?
th-cam.com/video/nr4_JRKCGBU/w-d-xo.html
Один нюанс для новых версий IntelliJ IDEA: галочка "Serializable class whithout 'serialVersionUID' находится теперь в группе "JVM languages"
как можно до этого догадаться? я пол часа потратил на поиски "Serializable class whithout 'serialVersionUID' чтобы поставить галочку в нужном месте? как в этом во всём разобраться?
Я поставил все галочки по настройкам старых версий, не помогло...в недоумении полез за инфой на англоязычные форумы. Все тоже самое и только один человек написал про поиск "Ctrl + Shift + A". Там ввел Serializable и из всех вариантов по логике выбрал нужное )
Спасибо тебе большое!
Спасибо тебе, добрый человек!!! Все доступно, доходчиво, понятно и без воды...
Спасибо за объяснение про try with resources
Очень полезный урок, спасибо! Особенно с применением полиморфизма try With Resources
Все, можно доставать диск с полки))
Спасибо за уроки 👍
5 лет прошло, привет из 2022)), пора открывать файл)
Единственная ПОПРАВКА.... try с ресурсами использует ресурсы которые реализуют Autocloseable, а НЕ Closeable. А так все на высшем уровне.
Спасибо за помощь, Наиль.
Интересная особенность работы transient.
1. Если поле пометить transient
2. Затем записать объекты в файл
3. Теперь убрать ключевое слово transient
4. А теперь прочитать объекты из файла
То окажется, что поля которые в момент записи были под запретом сериализации на самом деле были записаны в файл и теперь будут доступны при чтении из файла.
InvalidClassException
уже не работает
Автор на 12:27 говорит, что если класс реализует интерфейс Closable, то его можно использовать в try with resourses. Наверное надо сказать, что этот механизм реализован благодаря интерфейсу Autoclosable.
"...допустим прошло 5 лет..." - 2 года уже прошло, ждем еще 3 :)
Уже 3 года прошло, ждем еще 2.
Jus
мужик, видел твои комы) что у тебя с прогерством? устраивался куда-нибудь?
@@manOfPlanetEarth До сих пор изучаю Java) Сейчас только на многопоточности. Каждый день трачу как минимум 4 часа. Но, если честно, то сильно замедлило обучение обстоятельства в жизни. Из-за них я пару дней пропустил, и несколько дней уделил только 1-2 часа на обучение(это очень мало). Сейчас уже проблем нет, и я снова активно изучаю.
Немного раздражает то, что авторы уроков иногда упускают очень важные детали, или пропускают половину методов класса. И приходится самому изучать на практике, или долго гуглить объяснения. Хотя, практика веселее.
Jus
я тоже новичок. посмотрим, как все сложится🤔 если не потеряю этот комент и будет что сказать - поделюсь)
@@manOfPlanetEarth Буду следить за вами, главное оставляйте комментарии о проделанном пути в изучении
всё интереснее и интереснее!:)
Спасибо за отличные уроки!
Небольшая поправка, для использования класса в try-with-resources он должен реализовывать интерфейс AutoCloaseble. Но и Cloaseble достаточно, т.к. он сам наследуется от AutoCloaseble
17.10.2018 Очеенннь благодарю все понятно !!!!!
Поправьте, если не прав. Но, что в предыдущих уроках по сериализации, что в этом, неправильно закрывать поток в блоке try{}, т.к. если вылетит ошибка то мы просто не дойдем до метода close() и поток не закроется. Без использования try с ресурсами закрытие потоков необходимо осуществлять в блоке finally{}. Ну, и про это уже вроде писали, класс должен реализовывать интерфейс Autocloseable для возможности закрывать его автоматически в блоке try с ресурсами, а не Closeable.
Да, Вы правы
Отлично подан материал, спасибо большое.
Один нюанс для новых версий IntelliJ IDEA: галочка "Serializable class whithout 'serialVersionUID' находится теперь в группе "JVM languages"
как можно до этого догадаться? я пол часа потратил на поиски "Serializable class whithout 'serialVersionUID' чтобы поставить галочку в нужном месте? как в этом во всём разобраться?
ну ты же разобрался и нам подсказал, ты уже молодец, спасибо!
Можно было поиском воспользоваться.
@@objectobj и где там находится поиск? как находить?
@@ЧесноковВячеслав-ъ5р Так в самом верху же поле поиска. Там даже лупа есть.
@@objectobj не находит Serializable class whithout 'serialVersionUID через поиск
Лучшие уроки, спасибо!
Однозначно лайк и благодарность)
SerialVersionUID нужно использовать перед, тем как собрался класс менять, чтоб те объекты, которые были созданы на основе старого класса идентифицировались?
Можно ли создавать несколько SerialVersionUID, чтоб сохранить несколько состояний?
При возникновении исключении try with resource в методе .close(), какое исключение подавляется?
о 5 лет как раз прошло 6:23
А объект типа FileInpustSream сам закрывается?
так как ObjectInputStream оборачивает FileInputStream, нам достаточно закрыть только ObjectInputStream.
Когда "класс-поток" оборачивает другие "классы-потоки", достаточно закрыть самый внешний, все внутренние закроются автоматически.
Спасибо)
то самое чувство когда говорят что будет допустим через 5 лет с серилизуемым обьектом, а ты из 2022 года
Про serialVersionUID не понял зачем он нужен? Типа он есть а как его использовать? Объясните пожалуйстааа:)
например есть несколько систем которые обмениваются объектами
в какой то момент формат объекта изменился, и его нужно, например, синхронно изменить во всех системах
если какая то система будет присылать старый формат то приемник не даст загрузить старые данные
@@Das.Kleine.Krokodil Просто и без него(serialVersionUID) оно так же закрашится. И покажет в консоле, что у тебя serialVersionUID отличается, если как Наиль ты поле поменял к примеру. Я тоже не вижу практического примения пока что. Что с ним, что без него краш одинаковый.
@@magellan127 видимо для того чтобы сделать это явно
@@Das.Kleine.Krokodil
private static final long serialVersionUID = -4285536860777108864L;
/* без него выбъет при изменении в классе ошибку:
Caused by: java.io.InvalidClassException: NeilCourse.Serialization.Person3; local class incompatible: stream classdesc serialVersionUID = -4285536860777108864, local class serialVersionUID = 8703533545316993911
А с ним запустит старую версию даже при добавленом поле в класс Person.
Я протестил.
+ (просто констатация того что в видео) если если добавить выше как показал в видео Наиль новую serialVersionUID выбъет тогда в этом случае также описанную выше ошибку*/
@@Das.Kleine.Krokodil И также еще такую штуку заметил: Если изменим имя поля или дадим ему non-access modifier transient, а serialVersionUID оставим старым = то вывод этого поля будет равняться дефолту null или 0 в зависимости от типа поля. !!!
Почему нельзя было непосредственно в IDE встроить какое-нибудь предупреждение если у тебя поток не закрыт?
Как открывать реализацию в Inteliji?
Ctrl + нажать на то, какую реализацию хотите посмотреть
спасибо
Вопрос. Есть рабочая, не сериализуемая переменная, которая в конструкторе устанавливается в -1.
Но после реализации она будет равна 0. Конструктор запускаться не будет при этом. И всё сломается.
Есть ли возможность "дать понять" классу, что он только что вышел из бинарного состояния, и было бы неплохо запустить некую предстартовую инициализацию рабочих переменных?
Или нужно это делать каждый раз ручками после десериализации?
Для этого можно определить методы:
private void readObject(InputStream in)
и
private void writeObject(OutputStream out)
для чтения и записи соответственно, внутри них нужно вызвать дефолтные методы для чтения и записи:
defaultReadObject(in);
и
defaultWriteObject(out);
а уже после них присвоить необходимые значения полям или вызвать заранее написанную для этого функцию. При сериализации/десериализации сначала произойдет проверка на существование методов приведенных в самом начале комментария в твоём классе и если они существуют - они будут вызваны вместо дефолтных.
Также можно имплементировать интерфейс Externalizible и написать соответствующие методы полностью руками. В таком случае сериализацию можно настроить ещё гибче
У меня нет вкладки "serialazible class without serialVersionUID" по указанном адресу. IDEA 2021.3 Ultimate
Поищи serializable class without 'serialVersionUID' в JVM languages
не понял только 1ого.
Если я запустил Write с 2 параметрами в конструктуре , и через 5 лет класс поменялся и сменился SerialVersionuuID , то я ни как не прочитаю уже тот обьект что сохранил 5 лет назад ? мне вылетит эта ошибка с сериалВерсион , и всё ? Можно удалить тот сохранёный обьект , как буд то его и не было ? По идее звучит , как будто " я больше не твой бро , иди ищи другого , с тобой я не связан больше" ... типо другая программа вобще полуается ведь
SerialVersionuuID наверное создан, чтобы ты не пудрил себе мозги, когда вылетит какая-то ошибка связанная с разностями класса. Ты просто увидел, что объект старый, версии класса не совпадают и все
это сделано чтобы была согласованность данных, чтобы нельзя было частично загрузить данные и нарушить поведение программы
если есть потребность загрузить старые версии объектов, то или программа должна поддерживать такую возможность или нужно использовать старые версии программы для загрузки
тут зависит от целей, и вообще откуда взялся файл со старой версией
может это ошибка программиста, что прислал тебе неактуальную структуру
может быть вчера обновляли несколько систем, а одну не обновили и от нее идет не та версия
Про переопределение методов writeObject и readObject забыли рассказать...
Будут уроки про Stream?
Есть в курсе “Продвинутая Java”
после 1 записи в файл, когда 1: Mike
мы записали и считали этот файл.
заменили поля класса person(НО не перезаписывали в файл), т.е в файле все еще находятся данные 1:Mike
почему после смены serialVersion мы не можем считать??
потому что не совпадают final long serialVersionUID
@@kladmonet9 человек имел ввиду, откуда Java это знает.
@@DolphinArtem джава сопоставляет 2 serialVersionUID, и всё, если они разные то выбрасывается исключение
Еще пара лет и можно будет доставать!
Привет, 3 года прошло с момента твоего комментария. на какой сейчас позиции? Или забросил?
@@АннаДомик я по окопам ползал) Полгода назад вернулся в обучение. Сейчас на этапе spring security
@@iddqd6299 Здорово) Какой молодец)) Поздравляю с возвращением домой.🤗
Вот и прошло 5 лет)
птицы на фоне красиво поют....
Спа-си-бо!
Видимо, с момента записи видео что-то поменялось, потому что такой настройки для serialVersionUID в IDEA у меня нет.
👍
У меня возник вопрос. Что такое defaultWriteObject() и для чего он нужен?
Есть кто из 2022 года, файл еще лежит?)
я из 22го. роботы заменили прогеров, бросай это дело, учи мехатронику
Я из 2023. В этом году мехатроники уже сильно устарели.
Я из 2024, мехатроники работают на заводе