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

Поділитися
Вставка
  • Опубліковано 29 вер 2024
  • МОЙ НОВЫЙ КУРС: • Мой курс "Продвинутая ...
    ПРАКТИКА НА JAVA: java-marathon....
    Реклама и сотрудничество: alishev.neil@gmail.com

КОМЕНТАРІ • 127

  • @alishevN
    @alishevN  6 років тому +5

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

  • @milordplus
    @milordplus 2 роки тому +51

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

    • @ИгорьВоронов-ъ4м
      @ИгорьВоронов-ъ4м 2 роки тому +5

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

    • @blackteam5273
      @blackteam5273 2 роки тому +1

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

    • @blackteam5273
      @blackteam5273 2 роки тому

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

    • @ИгорьВоронов-ъ4м
      @ИгорьВоронов-ъ4м 2 роки тому

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

    • @blackteam5273
      @blackteam5273 2 роки тому

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

  • @Jek790
    @Jek790 2 роки тому +70

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

  • @MikeStarman
    @MikeStarman 2 роки тому +12

    ua-cam.com/video/nr4_JRKCGBU/v-deo.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 Рік тому +1

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

  • @pavelleshchuk6709
    @pavelleshchuk6709 Рік тому

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

  • @mikhaillazarev5378
    @mikhaillazarev5378 2 роки тому

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

  • @R0MaNbI4-
    @R0MaNbI4- 10 місяців тому

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

  • @hikmatasgarli7036
    @hikmatasgarli7036 6 років тому +3

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

  • @dien0000
    @dien0000 5 місяців тому

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

  • @scxaadjaksjdxmnwsmfdkfjkd
    @scxaadjaksjdxmnwsmfdkfjkd Рік тому

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

  • @farfar3890
    @farfar3890 2 роки тому

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

    • @alishevN
      @alishevN  2 роки тому +2

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

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 2 роки тому +20

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

  • @q1r27dark9
    @q1r27dark9 2 роки тому +5

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

  • @ЧесноковВячеслав-ъ5р

    Один нюанс для новых версий 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 через поиск

  • @SatUluBah
    @SatUluBah 3 роки тому +6

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

  • @blackmulthumor
    @blackmulthumor 3 роки тому +25

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

    • @markmorev4600
      @markmorev4600 2 роки тому +3

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

    • @АннаДомик
      @АннаДомик 2 місяці тому

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

  • @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 Буду следить за вами, главное оставляйте комментарии о проделанном пути в изучении

  • @provincialstyle6775
    @provincialstyle6775 2 роки тому +2

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

  • @arthurfonzerelli6484
    @arthurfonzerelli6484 6 років тому +3

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

  • @dmytromatvieiev8932
    @dmytromatvieiev8932 4 роки тому +3

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

  • @q0wot285
    @q0wot285 Рік тому +1

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

  • @Ronobiliv
    @Ronobiliv 2 роки тому +2

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

  • @BessmertniyJoe
    @BessmertniyJoe 7 років тому +3

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

    • @alishevN
      @alishevN  7 років тому +35

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

  • @ivandvoinenko5449
    @ivandvoinenko5449 5 років тому +8

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

  • @АЛЕКСАНДРБАРАГИН-г7и

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

  • @dotnet2012
    @dotnet2012 2 роки тому +1

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

  • @arthurfonzerelli6484
    @arthurfonzerelli6484 6 років тому +1

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

  • @nurmagerkesh5901
    @nurmagerkesh5901 2 роки тому +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 в зависимости от типа поля. !!!

  • @EugenBatmanoff
    @EugenBatmanoff 3 роки тому +1

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

  • @jamjam3337
    @jamjam3337 Місяць тому

    спасибо

  • @Artem_35_
    @Artem_35_ 6 років тому +7

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

  • @olexiypysarenko8090
    @olexiypysarenko8090 6 років тому +2

    Спасибо)

  • @mirnijalexey2765
    @mirnijalexey2765 4 роки тому +2

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

    • @eugeneives1593
      @eugeneives1593 4 роки тому

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

    • @viptutorials
      @viptutorials 3 роки тому +2

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

    • @djlark2002
      @djlark2002 3 місяці тому

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

  • @kladmonet9
    @kladmonet9 4 роки тому +1

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

  • @zombiefast0925
    @zombiefast0925 4 роки тому +1

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

  • @Devivl
    @Devivl Рік тому

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

  • @mihailkrysan1275
    @mihailkrysan1275 2 роки тому

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

    • @alexgordeeff
      @alexgordeeff 2 роки тому

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

  • @Anatoli-bq1pe
    @Anatoli-bq1pe 2 роки тому

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

  • @kirillb2611
    @kirillb2611 2 роки тому

    👍

  • @jurakatkov5092
    @jurakatkov5092 2 роки тому

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

  • @MrDepava
    @MrDepava 5 років тому

    Спа-си-бо!

  • @ЯковПермитин-э2ж
    @ЯковПермитин-э2ж 4 роки тому

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

    • @gleb_bro8710
      @gleb_bro8710 4 роки тому +5

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

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 2 роки тому +1

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

  • @Andrzej3935
    @Andrzej3935 3 роки тому

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

  • @Sanchio
    @Sanchio 2 роки тому +3

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

  • @Nidvoraich
    @Nidvoraich 3 роки тому

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

    • @ponny256
      @ponny256 Рік тому +1

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

  • @iddqd6299
    @iddqd6299 3 роки тому

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

    • @АннаДомик
      @АннаДомик 2 місяці тому

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

    • @iddqd6299
      @iddqd6299 2 місяці тому

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

    • @АннаДомик
      @АннаДомик 2 місяці тому

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

  • @urbans6
    @urbans6 4 роки тому +2

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

    • @kladmonet9
      @kladmonet9 4 роки тому

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

    • @DolphinArtem
      @DolphinArtem 2 роки тому

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

    • @БудькакЯ-м8ы
      @БудькакЯ-м8ы 2 роки тому +1

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

  • @diegod4811
    @diegod4811 7 років тому

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

  • @Gingerfuckingbass
    @Gingerfuckingbass 6 років тому +13

    если не использовать try-with-resources, то close() по идее нужно вызывать в finally блоке

    • @alishevN
      @alishevN  6 років тому +8

      да, вы правы

    • @alexandrkomar4741
      @alexandrkomar4741 3 роки тому

      да. это было в уроке об обработке exception

    • @DolphinArtem
      @DolphinArtem 2 роки тому +4

      @@alexandrkomar4741 не было