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