Java SE. Урок 32. Сериализация | Десериализация Объектов

Поделиться
HTML-код
  • Опубликовано: 29 сен 2024
  • Сериализация - это процесс преобразования объектов в потоки байтов для хранения.
    Десериализация - процесс извлечение объекта из потока байтов.
    Для сериализации объекта, его класс должен реализовывать либо интерфейс Serializable либо Externalizable. Поля класса также должны реализовывать данные интерфейсы, если они являются объектами. Интерфейс Serializable является интерфейсом-маркером-меткой, и не требует реализации каких либо методов. В случае с интерфейсом Externalizable необходимо будет переопределить методы readObject/writeObject
    Значения полей помеченные спецификаторами transient и static не сериализуются (не сохраняются). Единственным исключением является поле:
    private static final long serialVersionUID которое сериализуется вместе с объектом. Оно вычисляется по содержимому класса либо устанавливается программистом самостоятельно. После сериализации объекта стоит знать, что изменив содержимое класса объект восстановить не получиться.
    При десериализации поля помеченные transient восстанавливаются по умолчанию. Если это ссылочные типы - то null.
    При десериализации поля помеченные static восстанавливаются по умолчанию в случае отсутствия в области видимости объектов данного класса. В противном случае - принимают значения актуальные в данный момент.
    Для записи объекта используется метод writeObject класса ObjectOutputStream, для чтения соответственно readObject класса ObjectInputStream.

Комментарии • 43

  • @zoongnguyen9377
    @zoongnguyen9377 7 лет назад +41

    Не пойму почему у вас такое маленькое количество просмотр,хотя канал ОЧЕНЬ хороший, споcибо вам большое за вашу работу

  • @PigManPig
    @PigManPig 4 года назад +1

    Сериализовать кота.. Не надо так с котиком!

  • @lautalanmoto
    @lautalanmoto 4 года назад +19

    Стерилизация кота. XD

  • @kirilmorhunov7716
    @kirilmorhunov7716 4 года назад +8

    Ставь лайк если ты против сериализации животных

  • @nikolayreznik2963
    @nikolayreznik2963 4 года назад +17

    Было бы здорово, почитать в описании или в конце послушать, маленький пример жизненный, где бы это пригодилось. Спасибо вам!

  • @javahalva8655
    @javahalva8655 2 года назад +3

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

  • @pavelkalinin1119
    @pavelkalinin1119 3 года назад +2

    Очень редкое сочетания понимания материала по it и дикторского искусства, без "ээ", "нуу" и т.д.

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  3 года назад +3

      Ээээ, нууу это... спасибо!))

    • @pavelkalinin1119
      @pavelkalinin1119 3 года назад

      @@followthewhiterabbit6924 У вас с раббитом, по Java EE чтонить есть?
      Белому привет!

  • @zzz13zzz17
    @zzz13zzz17 2 года назад +1

    "Кровь из глаз" стайл

  • @ЕвгенийСиницын-и4х
    @ЕвгенийСиницын-и4х 3 года назад +1

    Не исключено что я тупой, но в этом уроке прям вообще суть не понятна: что такое сериализация вообще. Даже записать как то нечего... Наверное пока здесь водятся драконы и мне здесь делать нечего))))

    • @АндрейКравцов-и4с
      @АндрейКравцов-и4с 3 года назад +1

      Да, зашёл найти такой комментарий. Всё видео смотрел как автор создавал. В этом видео не было объяснения, как в предыдущих.

  • @renat19831983
    @renat19831983 6 лет назад +2

    Александр, молодец! Все очень доступно объясняешь)

  • @ХединДобрый
    @ХединДобрый 5 лет назад +1

    Мне кажется, что если ты назвал класс Serializator то логично, что он должен работать не только для класса Cat. Я в его методах принимал и возвращал класс типа Object, а уже потом приводил к Cat.

  • @mrsalem8118
    @mrsalem8118 5 лет назад +2

    "Грамотные дядьки" XD

    • @mrsalem8118
      @mrsalem8118 5 лет назад +1

      шикарный канал)

  • @alexandrkomar4741
    @alexandrkomar4741 3 года назад

    Module 'javaprograam' production: java.lang.ClassCastException: org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast to org.jetbrains.jps.builders.java.dependencyView.TypeRepr$ClassType
    что это за ошибка? у меня не получилось

  • @andriybondarenko6282
    @andriybondarenko6282 7 лет назад +1

    Вечер добрый! Спасибо Вам за новый урок! Александр, не подскажите, по какому принципу происходит десериализация, т.к. в случае сериализации объекта с дальнейшим изменением названия поля прямо в файле, десериализация выбрасывает исключение. То есть информация об объекте в файле как-то связана с классом в jvm, но как компилятор может знать длину подстроки-поля, которую необходимо десериализовать?

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  7 лет назад +2

      Как мне кажется, должно было быть так:
      В зависимости от содержимого класса и его объявления - должен генерироваться UID ключ, который должен вычисляться как хэш-код и быть "уникальным" . Если содержимое класса меняется - то меняется и UID.
      При сериализации UID сохраняется вместе с объектом. А вот при десериализации JVM каким-то образом должна знать этот UID для "каждого класса" и это значение сравнивается с имеющимся в файле. Если значения совпадают - значит все ОК. Если нет - то эксепшн.
      Но это лишь мое видение. В реальности значение UID можно выставлять самому. В таком случае, каким образом происходит понимание что это разные файлы/объекты/класса - я не знаю. Надо рыть документацию.

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  7 лет назад +5

      Забыл сказать, но в описании к видео добавил:
      private static final long serialVersionUID - единственное static поле которое сериализуется вместе с объектом.

  • @tokepala5227
    @tokepala5227 5 лет назад

    еее!!! как я люблю это вступление!!! спасибо, продолжаю изучать Java !!! спасибо !!!

  • @romamvp
    @romamvp 4 года назад

    oos ненужно проверять на null, просто сначала flush() а потом close()

  • @АнтонМакаров-р8й
    @АнтонМакаров-р8й 7 лет назад

    Довольно таки не плохой канал , продолжай в том же духе . Есть конечно не понятные нюансы , но в общем всё предельно ясно.

  • @androidkotlin-6234
    @androidkotlin-6234 2 года назад

    Красаучик, жи есть!

  • @olegliakhovets8224
    @olegliakhovets8224 3 года назад

    Спасибо за видео! Канал супер!

  • @КонстантинКучуров
    @КонстантинКучуров 3 года назад

    А где видео урок №33 и что там?

  • @ГлебВалерьевич-у6ы
    @ГлебВалерьевич-у6ы 2 года назад

    Это круто. Но как быть, если нужно сереализовать несколько объектов?

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  2 года назад

      Можно завернуть их в объект и сереализовать этот объект :)

    • @ГлебВалерьевич-у6ы
      @ГлебВалерьевич-у6ы 2 года назад

      @@followthewhiterabbit6924 а предметно? Условно есть класс Developer. Как их десериализовать в ArrayList ?

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  2 года назад

      @@ГлебВалерьевич-у6ы Наверное, вы имели ввиду сереализовать ArrayList. Для этого создаете класс DevelopersWrapper и положите туда ArrayList, дальше сереализуйте и десериализуйте

  • @atlasua2021
    @atlasua2021 4 года назад

    Ты реальный мужик! Спасибо за твои уроки.

  • @ilyamoroz3175
    @ilyamoroz3175 6 лет назад

    Саш, вы молодец)

  • @Евгений-ч9к2ф
    @Евгений-ч9к2ф 7 лет назад

    Спрошу что бы проверить правильно ли я понимаю и не упустил ли чего .
    ваш код:
    File file = new File("D:/cat.data");
    ObjectOutputStream oos = null;
    try {
    FileOutputStream fos = new FileOutputStream(file);
    if (fos!=null){
    oos = new ObjectOutputStream(fos);
    oos.writeObject(cat);
    flag = true;
    }
    }catch (FileNotFoundException e) {
    e.printStackTrace();
    }catch (IOException e) {
    e.printStackTrace();
    }

    • @Евгений-ч9к2ф
      @Евгений-ч9к2ф 7 лет назад

      1- создаем файл в папке дата
      2- ссылка на объект потока объектов
      3- создаем объект потока типа файл и передаем ему наш созданный файл (указываем в какое место он будет серриализировать?)
      4- создаем объект потока объектов и передаем ему объект типа файл( а вот тут странно повторяется ситуация)
      5- oos.writeObject(cat);
      далее проверка 1 - найден ли файл, 2 - есть ли что передавать в файл

    • @Евгений-ч9к2ф
      @Евгений-ч9к2ф 7 лет назад

      такое ощущение что пункты 3 и 4 выполняют одно действие - значит я не допонил их разницу. Подскажите знатоки!

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  7 лет назад +2

      3. Создаем объект типа FileOutputStream - это и есть поток. Когда мы в поток передаем file - мы лишь связываем его с потоком.
      4. В поток ObjectOutputStream мы передаем объект типа FileOutputStream. В данном случае ObjectOutputStream - выступает оберткой для данного потока, для того чтобы мы могли записать объект. Так как у объекта типа FileOutputStream нет метода writeObject

    • @Евгений-ч9к2ф
      @Евгений-ч9к2ф 7 лет назад

      этот "поток в потоке" выглядит как то не оправданно, а все из за того что в нем нет нет метода writeObject как оказывается...
      Спасибо за быстрый ответ)

    • @followthewhiterabbit6924
      @followthewhiterabbit6924  7 лет назад

      Пожалуйста )

  • @vitaliiche2706
    @vitaliiche2706 7 лет назад

    Спасибо!

  • @alexcrafter7186
    @alexcrafter7186 5 лет назад +1

    Добрый день. Выложите пожалуйста код всех ваших занятий в облако чтоб можно было их скачать.