JavaRush /Курсы /Java Core /Сохранение данных/externalizable

Сохранение данных/externalizable

Java Core
10 уровень , 6 лекция
Открыта

— Привет, Амиго! Хотел бы немного дополнить то, что рассказала тебе Элли.

Иногда бывает нужно управлять процессом сериализации. Вот одни из причин:

1) Объект не готов к сериализации: его нынешнее внутреннее состояние в процессе изменения.

2) Объект содержит несериализуемые объекты, но может перевести их в удобную для сериализации форму: сохранить в массив байт или что-нибудь еще.

3) Объект хочет десериализовать все свои данные, как одно целое и/или зашифровать их перед сериализацией.

Причин выполнить сериализацию в ручном режиме может быть множество. Но не хотелось бы лишаться всех тех преимуществ, которые дает стандартная сериализация. Ведь наш объект могут использовать другие объекты. И они тоже не смогут сериализоваться, если наш объект откажется от поддержки сериализации.

На этот случай тоже есть решение – интерфейс Externalizable. Спасибо дальновидным разработчикам Java. Достаточно заменить интерфейс Serializable на интерфейс Externalizable, и ваш класс сможет управлять процессом сериализации в ручном режиме.

Дело в том, что интерфейс Externalizable, в отличие от Serializable, содержит два метода, которые вызываются Java-машиной при сериализации объекта. Вот как это выглядит:

Код
class Cat implements Externalizable
{
 public String name;
 public int age;
 public int weight;

 public void writeExternal(ObjectOutput out)
 {
  out.writeObject(name);
  out.writeInt(age);
  out.writeInt(weight);
}

 public void readExternal(ObjectInput in)
 {
  name = (String) in.readObject();
  age = in.readInt();
  weight = in.readInt();
 }
}

Ничего не напоминает?

— Ух ты! Именно так мы пробовали сохранять объекты до «изобретения» сериализации.

— Да, теперь все просто: если устраивает стандартная сериализация – просто наследуем наш класс от интерфейса Serializable. Если не устраивает – наследуем от Externalizable и пишем код для сохранения/загрузки объекта нашего класса.

— А класс, помеченный Externalizable, считается сериализуемым? Мы можем «безопасно» хранить на него ссылки в наших сериализуемых классах?

— Да. Если класс реализует интерфейс Serializable или Externalizable, он считается сериализуемым.

— Отличное решение. Мне нравится.

— Рад это слышать. Но это еще не всё… Спроси лучше профессора Ханса о всяких нюансах. Они тут точно есть. Он хотел тебе дать что-то почитать.

Комментарии (116)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
{Java_Shark} Уровень 35
16 декабря 2024
++
Valerius Maximus Уровень 29
18 августа 2024
18.8.2024
Максим Li Уровень 40
11 мая 2024
11.05.2024
Jroslav Уровень 50
12 февраля 2024
https://habr.com/ru/articles/431524/
Dmitry Shaburov Уровень 33
17 ноября 2023
17/11/2023
Raf Java Master Уровень 31
11 сентября 2023
Дисциплина и гринд господа, мы победим!
Ислам Уровень 33
12 июля 2023
Nice
No Name Уровень 36
9 июля 2023
Что если реализовать оба этих интерфейса в классе?
ivan Уровень 40
22 июня 2023
https://www.youtube.com/watch?v=8accK8dHaa4 видос на 10мин. это не алишев. вам сразу станет все понятно
Andrei Paşa Уровень 27
18 августа 2023
Спасибо за ссылку. P.S. Хоть это и не Алишев, но всё равно пришлось смотреть на скорости х2 :)
ivan Уровень 40
18 августа 2023
мне не нравится алишев. видосы заура трегулова заходят лучше
Andrei Paşa Уровень 27
19 августа 2023
Алишев очень доступно объясняет с хорошими примерами и с минимумом абстракций, но, к сожалению, я не могу его долго смотреть из-за того, что он говорит предложениями из одного слова: "Создадим. Объект. Для. ... ... Чтения. Из. Файла". Это особенно слышно при ускоренном воспроизведении. Нашёл канал Заура - пока зашло "на ура". Спасибо за наводку, подписался и на него.
ivan Уровень 40
19 августа 2023
рад помочь) да действительно. его реально сложно слушать на 2x. а заура норм еще dmdev хороший. курсы заура и dmdev стоят своих денег. я учил/учу джаву, spring core, spring MVC по зауру. а sql и остальное про spring по dmdev
18 июня 2023
/* Комментарий удален */