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, він вважається таким, що серіалізується.

— Відмінне рішення. Мені подобається.

— Радий це чути. Але це ще не все... Запитай краще професора Ганса про всі нюанси. Вони тут точно є. Він хотів тобі дати щось почитати.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ