Java для начинающих. Урок 47: Сериализация (часть 3). Transient, serialVersionUID.

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 ธ.ค. 2024

ความคิดเห็น • 127

  • @alishevN
    @alishevN  7 ปีที่แล้ว +5

    Регистрируйтесь на курс "Продвинутая Java": th-cam.com/video/rRe1vT0SDD8/w-d-xo.html
    Практикуйтесь в написании Java кода: java-marathon.tilda.ws

  • @milordplus
    @milordplus 2 ปีที่แล้ว +50

    Небольшая поправка на 2022 год. Опция Serializable теперь находится не в Java/Serialization issues. Теперь она чуть ниже в JVM Languages. Ну а вообще поиск по настройкам всем в помощь на все времена))

    • @ИгорьВоронов-ъ4м
      @ИгорьВоронов-ъ4м 2 ปีที่แล้ว +4

      спасибо большое. 20 минут убил на метод проб и ошибок, потом плюнул и только потом догадался в комментах глянуть

    • @blackteam5273
      @blackteam5273 2 ปีที่แล้ว +1

      Спасибо, тоже долго искал!

    • @blackteam5273
      @blackteam5273 2 ปีที่แล้ว

      @@ИгорьВоронов-ъ4м как успехи?

    • @ИгорьВоронов-ъ4м
      @ИгорьВоронов-ъ4м 2 ปีที่แล้ว

      @@blackteam5273 норм. Хотя смотря о чем ты

    • @blackteam5273
      @blackteam5273 2 ปีที่แล้ว

      @@ИгорьВоронов-ъ4м успехи в программировании

  • @Jek790
    @Jek790 2 ปีที่แล้ว +70

    Смотрю этот урок в 2022 году. С 2017го как раз "прошло 5 лет"

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 2 ปีที่แล้ว +20

    00:00 Transient
    03:54 serialVersionUID
    10:08 try with resources

  • @blackmulthumor
    @blackmulthumor 4 ปีที่แล้ว +25

    Очень грамотный учитель. Столько терпения и самопожертвования нужно, чтобы делиться бесплатно такими знаниями в ютуб, если учитывать тот факт, что полезный контент редко бывает особо популярным и приносит мизерные доходы

    • @markmorev4600
      @markmorev4600 2 ปีที่แล้ว +3

      Вернее сказать специализированный контент редко бывает популярным

    • @АннаДомик
      @АннаДомик 5 หลายเดือนก่อน

      Привет, 3 года прошло с момента твоего комментария. на какой сейчас позиции? Или забросил?

  • @MikeStarman
    @MikeStarman 2 ปีที่แล้ว +12

    th-cam.com/video/nr4_JRKCGBU/w-d-xo.html
    Один нюанс для новых версий IntelliJ IDEA: галочка "Serializable class whithout 'serialVersionUID' находится теперь в группе "JVM languages"

    • @ЧесноковВячеслав-ъ5р
      @ЧесноковВячеслав-ъ5р 2 ปีที่แล้ว

      как можно до этого догадаться? я пол часа потратил на поиски "Serializable class whithout 'serialVersionUID' чтобы поставить галочку в нужном месте? как в этом во всём разобраться?

    • @solitarywanderer8571
      @solitarywanderer8571 2 ปีที่แล้ว +1

      Я поставил все галочки по настройкам старых версий, не помогло...в недоумении полез за инфой на англоязычные форумы. Все тоже самое и только один человек написал про поиск "Ctrl + Shift + A". Там ввел Serializable и из всех вариантов по логике выбрал нужное )

    • @SS.Bazhenov
      @SS.Bazhenov 2 ปีที่แล้ว +1

      Спасибо тебе большое!

  • @АЛЕКСАНДРБАРАГИН-г7и
    @АЛЕКСАНДРБАРАГИН-г7и 3 ปีที่แล้ว +2

    Спасибо тебе, добрый человек!!! Все доступно, доходчиво, понятно и без воды...

  • @dmytromatvieiev8932
    @dmytromatvieiev8932 4 ปีที่แล้ว +3

    Спасибо за объяснение про try with resources

  • @pavelleshchuk6709
    @pavelleshchuk6709 ปีที่แล้ว

    Очень полезный урок, спасибо! Особенно с применением полиморфизма try With Resources

  • @Ronobiliv
    @Ronobiliv 3 ปีที่แล้ว +2

    Все, можно доставать диск с полки))
    Спасибо за уроки 👍

  • @q1r27dark9
    @q1r27dark9 2 ปีที่แล้ว +5

    5 лет прошло, привет из 2022)), пора открывать файл)

  • @SatUluBah
    @SatUluBah 3 ปีที่แล้ว +7

    Единственная ПОПРАВКА.... try с ресурсами использует ресурсы которые реализуют Autocloseable, а НЕ Closeable. А так все на высшем уровне.

  • @Devivl
    @Devivl 2 ปีที่แล้ว

    Спасибо за помощь, Наиль.

  • @Artem_35_
    @Artem_35_ 6 ปีที่แล้ว +7

    Интересная особенность работы transient.
    1. Если поле пометить transient
    2. Затем записать объекты в файл
    3. Теперь убрать ключевое слово transient
    4. А теперь прочитать объекты из файла
    То окажется, что поля которые в момент записи были под запретом сериализации на самом деле были записаны в файл и теперь будут доступны при чтении из файла.

  • @ivandvoinenko5449
    @ivandvoinenko5449 5 ปีที่แล้ว +8

    Автор на 12:27 говорит, что если класс реализует интерфейс Closable, то его можно использовать в try with resourses. Наверное надо сказать, что этот механизм реализован благодаря интерфейсу Autoclosable.

  • @alekseyfrozis937
    @alekseyfrozis937 5 ปีที่แล้ว +29

    "...допустим прошло 5 лет..." - 2 года уже прошло, ждем еще 3 :)

    • @NiflheimForever
      @NiflheimForever 4 ปีที่แล้ว +3

      Уже 3 года прошло, ждем еще 2.

    • @manOfPlanetEarth
      @manOfPlanetEarth 4 ปีที่แล้ว

      Jus
      мужик, видел твои комы) что у тебя с прогерством? устраивался куда-нибудь?

    • @NiflheimForever
      @NiflheimForever 4 ปีที่แล้ว +5

      @@manOfPlanetEarth До сих пор изучаю Java) Сейчас только на многопоточности. Каждый день трачу как минимум 4 часа. Но, если честно, то сильно замедлило обучение обстоятельства в жизни. Из-за них я пару дней пропустил, и несколько дней уделил только 1-2 часа на обучение(это очень мало). Сейчас уже проблем нет, и я снова активно изучаю.
      Немного раздражает то, что авторы уроков иногда упускают очень важные детали, или пропускают половину методов класса. И приходится самому изучать на практике, или долго гуглить объяснения. Хотя, практика веселее.

    • @manOfPlanetEarth
      @manOfPlanetEarth 4 ปีที่แล้ว +1

      Jus
      я тоже новичок. посмотрим, как все сложится🤔 если не потеряю этот комент и будет что сказать - поделюсь)

    • @andreyrybolovlev7580
      @andreyrybolovlev7580 4 ปีที่แล้ว

      @@manOfPlanetEarth Буду следить за вами, главное оставляйте комментарии о проделанном пути в изучении

  • @kladmonet9
    @kladmonet9 4 ปีที่แล้ว +1

    всё интереснее и интереснее!:)

  • @zombiefast0925
    @zombiefast0925 4 ปีที่แล้ว +1

    Спасибо за отличные уроки!

  • @R0MaNbI4-
    @R0MaNbI4- ปีที่แล้ว

    Небольшая поправка, для использования класса в try-with-resources он должен реализовывать интерфейс AutoCloaseble. Но и Cloaseble достаточно, т.к. он сам наследуется от AutoCloaseble

  • @hikmatasgarli7036
    @hikmatasgarli7036 6 ปีที่แล้ว +3

    17.10.2018 Очеенннь благодарю все понятно !!!!!

  • @dotnet2012
    @dotnet2012 2 ปีที่แล้ว +1

    Поправьте, если не прав. Но, что в предыдущих уроках по сериализации, что в этом, неправильно закрывать поток в блоке try{}, т.к. если вылетит ошибка то мы просто не дойдем до метода close() и поток не закроется. Без использования try с ресурсами закрытие потоков необходимо осуществлять в блоке finally{}. Ну, и про это уже вроде писали, класс должен реализовывать интерфейс Autocloseable для возможности закрывать его автоматически в блоке try с ресурсами, а не Closeable.

    • @kuzd4niil
      @kuzd4niil 2 ปีที่แล้ว

      Да, Вы правы

  • @mikhaillazarev5378
    @mikhaillazarev5378 2 ปีที่แล้ว

    Отлично подан материал, спасибо большое.

  • @ЧесноковВячеслав-ъ5р
    @ЧесноковВячеслав-ъ5р 2 ปีที่แล้ว +4

    Один нюанс для новых версий IntelliJ IDEA: галочка "Serializable class whithout 'serialVersionUID' находится теперь в группе "JVM languages"
    как можно до этого догадаться? я пол часа потратил на поиски "Serializable class whithout 'serialVersionUID' чтобы поставить галочку в нужном месте? как в этом во всём разобраться?

    • @markmorev4600
      @markmorev4600 2 ปีที่แล้ว

      ну ты же разобрался и нам подсказал, ты уже молодец, спасибо!

    • @objectobj
      @objectobj 2 ปีที่แล้ว

      Можно было поиском воспользоваться.

    • @ЧесноковВячеслав-ъ5р
      @ЧесноковВячеслав-ъ5р 2 ปีที่แล้ว

      @@objectobj и где там находится поиск? как находить?

    • @objectobj
      @objectobj 2 ปีที่แล้ว +2

      @@ЧесноковВячеслав-ъ5р Так в самом верху же поле поиска. Там даже лупа есть.

    • @alexsisdrobyshev2462
      @alexsisdrobyshev2462 ปีที่แล้ว

      @@objectobj не находит Serializable class whithout 'serialVersionUID через поиск

  • @Andrzej3935
    @Andrzej3935 3 ปีที่แล้ว

    Лучшие уроки, спасибо!

  • @Anatoli-bq1pe
    @Anatoli-bq1pe 2 ปีที่แล้ว

    Однозначно лайк и благодарность)

  • @dien0000
    @dien0000 8 หลายเดือนก่อน

    SerialVersionUID нужно использовать перед, тем как собрался класс менять, чтоб те объекты, которые были созданы на основе старого класса идентифицировались?
    Можно ли создавать несколько SerialVersionUID, чтоб сохранить несколько состояний?
    При возникновении исключении try with resource в методе .close(), какое исключение подавляется?

  • @q0wot285
    @q0wot285 2 ปีที่แล้ว +1

    о 5 лет как раз прошло 6:23

  • @BessmertniyJoe
    @BessmertniyJoe 7 ปีที่แล้ว +3

    А объект типа FileInpustSream сам закрывается?

    • @alishevN
      @alishevN  7 ปีที่แล้ว +35

      так как ObjectInputStream оборачивает FileInputStream, нам достаточно закрыть только ObjectInputStream.
      Когда "класс-поток" оборачивает другие "классы-потоки", достаточно закрыть самый внешний, все внутренние закроются автоматически.

  • @olexiypysarenko8090
    @olexiypysarenko8090 6 ปีที่แล้ว +2

    Спасибо)

  • @provincialstyle6775
    @provincialstyle6775 2 ปีที่แล้ว +2

    то самое чувство когда говорят что будет допустим через 5 лет с серилизуемым обьектом, а ты из 2022 года

  • @nurmagerkesh5901
    @nurmagerkesh5901 3 ปีที่แล้ว +2

    Про serialVersionUID не понял зачем он нужен? Типа он есть а как его использовать? Объясните пожалуйстааа:)

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 2 ปีที่แล้ว +2

      например есть несколько систем которые обмениваются объектами
      в какой то момент формат объекта изменился, и его нужно, например, синхронно изменить во всех системах
      если какая то система будет присылать старый формат то приемник не даст загрузить старые данные

    • @magellan127
      @magellan127 ปีที่แล้ว

      @@Das.Kleine.Krokodil Просто и без него(serialVersionUID) оно так же закрашится. И покажет в консоле, что у тебя serialVersionUID отличается, если как Наиль ты поле поменял к примеру. Я тоже не вижу практического примения пока что. Что с ним, что без него краш одинаковый.

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil ปีที่แล้ว +1

      @@magellan127 видимо для того чтобы сделать это явно

    • @magellan127
      @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 выбъет тогда в этом случае также описанную выше ошибку*/

    • @magellan127
      @magellan127 ปีที่แล้ว

      @@Das.Kleine.Krokodil И также еще такую штуку заметил: Если изменим имя поля или дадим ему non-access modifier transient, а serialVersionUID оставим старым = то вывод этого поля будет равняться дефолту null или 0 в зависимости от типа поля. !!!

  • @arthurfonzerelli6484
    @arthurfonzerelli6484 7 ปีที่แล้ว +3

    Почему нельзя было непосредственно в IDE встроить какое-нибудь предупреждение если у тебя поток не закрыт?

  • @scxaadjaksjdxmnwsmfdkfjkd
    @scxaadjaksjdxmnwsmfdkfjkd ปีที่แล้ว

    Как открывать реализацию в Inteliji?

  • @jamjam3337
    @jamjam3337 4 หลายเดือนก่อน

    спасибо

  • @Nidvoraich
    @Nidvoraich 3 ปีที่แล้ว

    Вопрос. Есть рабочая, не сериализуемая переменная, которая в конструкторе устанавливается в -1.
    Но после реализации она будет равна 0. Конструктор запускаться не будет при этом. И всё сломается.
    Есть ли возможность "дать понять" классу, что он только что вышел из бинарного состояния, и было бы неплохо запустить некую предстартовую инициализацию рабочих переменных?
    Или нужно это делать каждый раз ручками после десериализации?

    • @ponny256
      @ponny256 ปีที่แล้ว +1

      Для этого можно определить методы:
      private void readObject(InputStream in)
      и
      private void writeObject(OutputStream out)
      для чтения и записи соответственно, внутри них нужно вызвать дефолтные методы для чтения и записи:
      defaultReadObject(in);
      и
      defaultWriteObject(out);
      а уже после них присвоить необходимые значения полям или вызвать заранее написанную для этого функцию. При сериализации/десериализации сначала произойдет проверка на существование методов приведенных в самом начале комментария в твоём классе и если они существуют - они будут вызваны вместо дефолтных.
      Также можно имплементировать интерфейс Externalizible и написать соответствующие методы полностью руками. В таком случае сериализацию можно настроить ещё гибче

  • @mihailkrysan1275
    @mihailkrysan1275 2 ปีที่แล้ว

    У меня нет вкладки "serialazible class without serialVersionUID" по указанном адресу. IDEA 2021.3 Ultimate

    • @alexgordeeff
      @alexgordeeff 2 ปีที่แล้ว

      Поищи serializable class without 'serialVersionUID' в JVM languages

  • @ЯковПермитин-э2ж
    @ЯковПермитин-э2ж 4 ปีที่แล้ว

    не понял только 1ого.
    Если я запустил Write с 2 параметрами в конструктуре , и через 5 лет класс поменялся и сменился SerialVersionuuID , то я ни как не прочитаю уже тот обьект что сохранил 5 лет назад ? мне вылетит эта ошибка с сериалВерсион , и всё ? Можно удалить тот сохранёный обьект , как буд то его и не было ? По идее звучит , как будто " я больше не твой бро , иди ищи другого , с тобой я не связан больше" ... типо другая программа вобще полуается ведь

    • @gleb_bro8710
      @gleb_bro8710 4 ปีที่แล้ว +5

      SerialVersionuuID наверное создан, чтобы ты не пудрил себе мозги, когда вылетит какая-то ошибка связанная с разностями класса. Ты просто увидел, что объект старый, версии класса не совпадают и все

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 2 ปีที่แล้ว +1

      это сделано чтобы была согласованность данных, чтобы нельзя было частично загрузить данные и нарушить поведение программы
      если есть потребность загрузить старые версии объектов, то или программа должна поддерживать такую возможность или нужно использовать старые версии программы для загрузки
      тут зависит от целей, и вообще откуда взялся файл со старой версией
      может это ошибка программиста, что прислал тебе неактуальную структуру
      может быть вчера обновляли несколько систем, а одну не обновили и от нее идет не та версия

  • @arthurfonzerelli6484
    @arthurfonzerelli6484 7 ปีที่แล้ว +1

    Про переопределение методов writeObject и readObject забыли рассказать...

  • @farfar3890
    @farfar3890 3 ปีที่แล้ว

    Будут уроки про Stream?

    • @alishevN
      @alishevN  3 ปีที่แล้ว +2

      Есть в курсе “Продвинутая Java”

  • @urbans6
    @urbans6 4 ปีที่แล้ว +2

    после 1 записи в файл, когда 1: Mike
    мы записали и считали этот файл.
    заменили поля класса person(НО не перезаписывали в файл), т.е в файле все еще находятся данные 1:Mike
    почему после смены serialVersion мы не можем считать??

    • @kladmonet9
      @kladmonet9 4 ปีที่แล้ว

      потому что не совпадают final long serialVersionUID

    • @DolphinArtem
      @DolphinArtem 3 ปีที่แล้ว

      @@kladmonet9 человек имел ввиду, откуда Java это знает.

    • @БудькакЯ-м8ы
      @БудькакЯ-м8ы 2 ปีที่แล้ว +1

      @@DolphinArtem джава сопоставляет 2 serialVersionUID, и всё, если они разные то выбрасывается исключение

  • @iddqd6299
    @iddqd6299 4 ปีที่แล้ว

    Еще пара лет и можно будет доставать!

    • @АннаДомик
      @АннаДомик 5 หลายเดือนก่อน

      Привет, 3 года прошло с момента твоего комментария. на какой сейчас позиции? Или забросил?

    • @iddqd6299
      @iddqd6299 5 หลายเดือนก่อน

      @@АннаДомик я по окопам ползал) Полгода назад вернулся в обучение. Сейчас на этапе spring security

    • @АннаДомик
      @АннаДомик 5 หลายเดือนก่อน

      @@iddqd6299 Здорово) Какой молодец)) Поздравляю с возвращением домой.🤗

  • @jurakatkov5092
    @jurakatkov5092 3 ปีที่แล้ว

    Вот и прошло 5 лет)

  • @EugenBatmanoff
    @EugenBatmanoff 3 ปีที่แล้ว +1

    птицы на фоне красиво поют....

  • @MrDepava
    @MrDepava 5 ปีที่แล้ว

    Спа-си-бо!

  • @Sanchio
    @Sanchio 2 ปีที่แล้ว +3

    Видимо, с момента записи видео что-то поменялось, потому что такой настройки для serialVersionUID в IDEA у меня нет.

  • @kirillb2611
    @kirillb2611 2 ปีที่แล้ว

    👍

  • @diegod4811
    @diegod4811 7 ปีที่แล้ว

    У меня возник вопрос. Что такое defaultWriteObject() и для чего он нужен?

  • @mirnijalexey2765
    @mirnijalexey2765 4 ปีที่แล้ว +2

    Есть кто из 2022 года, файл еще лежит?)

    • @eugeneives1593
      @eugeneives1593 4 ปีที่แล้ว

      я из 22го. роботы заменили прогеров, бросай это дело, учи мехатронику

    • @viptutorials
      @viptutorials 3 ปีที่แล้ว +2

      Я из 2023. В этом году мехатроники уже сильно устарели.

    • @djlark2002
      @djlark2002 6 หลายเดือนก่อน

      Я из 2024, мехатроники работают на заводе