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.
Не пойму почему у вас такое маленькое количество просмотр,хотя канал ОЧЕНЬ хороший, споcибо вам большое за вашу работу
Спасибо!
Сериализовать кота.. Не надо так с котиком!
Стерилизация кота. XD
Ставь лайк если ты против сериализации животных
Было бы здорово, почитать в описании или в конце послушать, маленький пример жизненный, где бы это пригодилось. Спасибо вам!
примитивнее некуда. этой информации не достаточно чтобы применять сериализацию, если ваш объект это не кот с одним полем. сразу возникнет миллион вопросов и проблем
Очень редкое сочетания понимания материала по it и дикторского искусства, без "ээ", "нуу" и т.д.
Ээээ, нууу это... спасибо!))
@@followthewhiterabbit6924 У вас с раббитом, по Java EE чтонить есть?
Белому привет!
"Кровь из глаз" стайл
Не исключено что я тупой, но в этом уроке прям вообще суть не понятна: что такое сериализация вообще. Даже записать как то нечего... Наверное пока здесь водятся драконы и мне здесь делать нечего))))
Да, зашёл найти такой комментарий. Всё видео смотрел как автор создавал. В этом видео не было объяснения, как в предыдущих.
Александр, молодец! Все очень доступно объясняешь)
Мне кажется, что если ты назвал класс Serializator то логично, что он должен работать не только для класса Cat. Я в его методах принимал и возвращал класс типа Object, а уже потом приводил к Cat.
"Грамотные дядьки" XD
шикарный канал)
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
что это за ошибка? у меня не получилось
Вечер добрый! Спасибо Вам за новый урок! Александр, не подскажите, по какому принципу происходит десериализация, т.к. в случае сериализации объекта с дальнейшим изменением названия поля прямо в файле, десериализация выбрасывает исключение. То есть информация об объекте в файле как-то связана с классом в jvm, но как компилятор может знать длину подстроки-поля, которую необходимо десериализовать?
Как мне кажется, должно было быть так:
В зависимости от содержимого класса и его объявления - должен генерироваться UID ключ, который должен вычисляться как хэш-код и быть "уникальным" . Если содержимое класса меняется - то меняется и UID.
При сериализации UID сохраняется вместе с объектом. А вот при десериализации JVM каким-то образом должна знать этот UID для "каждого класса" и это значение сравнивается с имеющимся в файле. Если значения совпадают - значит все ОК. Если нет - то эксепшн.
Но это лишь мое видение. В реальности значение UID можно выставлять самому. В таком случае, каким образом происходит понимание что это разные файлы/объекты/класса - я не знаю. Надо рыть документацию.
Забыл сказать, но в описании к видео добавил:
private static final long serialVersionUID - единственное static поле которое сериализуется вместе с объектом.
еее!!! как я люблю это вступление!!! спасибо, продолжаю изучать Java !!! спасибо !!!
oos ненужно проверять на null, просто сначала flush() а потом close()
Довольно таки не плохой канал , продолжай в том же духе . Есть конечно не понятные нюансы , но в общем всё предельно ясно.
Красаучик, жи есть!
Спасибо за видео! Канал супер!
А где видео урок №33 и что там?
Это круто. Но как быть, если нужно сереализовать несколько объектов?
Можно завернуть их в объект и сереализовать этот объект :)
@@followthewhiterabbit6924 а предметно? Условно есть класс Developer. Как их десериализовать в ArrayList ?
@@ГлебВалерьевич-у6ы Наверное, вы имели ввиду сереализовать ArrayList. Для этого создаете класс DevelopersWrapper и положите туда ArrayList, дальше сереализуйте и десериализуйте
Ты реальный мужик! Спасибо за твои уроки.
Спасибо )
Саш, вы молодец)
Спрошу что бы проверить правильно ли я понимаю и не упустил ли чего .
ваш код:
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();
}
1- создаем файл в папке дата
2- ссылка на объект потока объектов
3- создаем объект потока типа файл и передаем ему наш созданный файл (указываем в какое место он будет серриализировать?)
4- создаем объект потока объектов и передаем ему объект типа файл( а вот тут странно повторяется ситуация)
5- oos.writeObject(cat);
далее проверка 1 - найден ли файл, 2 - есть ли что передавать в файл
такое ощущение что пункты 3 и 4 выполняют одно действие - значит я не допонил их разницу. Подскажите знатоки!
3. Создаем объект типа FileOutputStream - это и есть поток. Когда мы в поток передаем file - мы лишь связываем его с потоком.
4. В поток ObjectOutputStream мы передаем объект типа FileOutputStream. В данном случае ObjectOutputStream - выступает оберткой для данного потока, для того чтобы мы могли записать объект. Так как у объекта типа FileOutputStream нет метода writeObject
этот "поток в потоке" выглядит как то не оправданно, а все из за того что в нем нет нет метода writeObject как оказывается...
Спасибо за быстрый ответ)
Пожалуйста )
Спасибо!
Пожалуйста )
Добрый день. Выложите пожалуйста код всех ваших занятий в облако чтоб можно было их скачать.