— Привіт, Аміго! Хотів би трохи доповнити те, що розповіла тобі Еллі.

Іноді буває потрібно керувати процесом серіалізації. Ось одна з причин:

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

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

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