— Привіт, Аміго! Хотів би трохи доповнити те, що розповіла тобі Еллі.
Іноді буває потрібно керувати процесом серіалізації. Ось одна з причин:
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, він вважається таким, що серіалізується.
— Відмінне рішення. Мені подобається.
— Радий це чути. Але це ще не все... Запитай краще професора Ганса про всі нюанси. Вони тут точно є. Він хотів тобі дати щось почитати.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ