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, он считается сериализуемым.

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

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

Комментарии (120)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
17 сентября 2025
Like
23 июня 2025
На удивление, достаточно понятная тема. Не читал доп статей, использовал ИИ-поиск с Алисой в Яндекс браузере по каждому новому термину, методу или классу. Практически все задачи с первого раза. Хотя, еще капитан Бобров впереди с его задачами "для дедушек"
invoker main Уровень 42
9 октября 2025
ненавижу боброва😎
{Java_Shark} Уровень 36
16 декабря 2024
++
Денис Кокшаров Уровень 1
24 марта 2025
++Java_Shark
Valerius Maximus Уровень 32
18 августа 2024
18.8.2024
Максим Li Уровень 30
11 мая 2024
11.05.2024
Jroslav Уровень 1
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 Уровень 22
9 июля 2023
Что если реализовать оба этих интерфейса в классе?