Іноді буває потрібно управляти процесом серіалізації. Ось одні з причин:
Інтерфейс Externalizable, на відміну від Serializable, містить два методи, які викликаються Java-машиною при серіалізації об'єкта:
- Об'єкт не готовий до серіалізації: його теперішній внутрішній стан в процесі зміни.
- Об'єкт містить несереалізовані об'єкти, але може перевести їх в зручну для серіалізації форму: зберегти в масив байт або що-небудь ще.
- Об'єкт хоче десеріалізувати всі свої дані, як одне ціле і / або зашифрувати їх перед серіалізацією.
Причин виконати серіалізацію в ручному режимі може бути безліч. Але не хотілося б втрачати всіх тих переваг, які дає стандартна серіалізація. Адже, об'єкти можуть використовувати інші об'єкти. І вони теж не зможуть бути серіалізовані, якщо об'єкт відмовиться від підтримки серіалізації.
На цей випадок теж є рішення - інтерфейс Externalizable. Досить замінити інтерфейс 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 і пишемо код для збереження / завантаження об'єкта нашого класу.
Якщо клас реалізує інтерфейс Serializable або Externalizable, він вважається серіалізованим.