– Cześć, Amigo! Chciałbym dodać kilka słów do tego, co powiedziała ci Basia.

Czasami trzeba kontrolować proces serializacji. Oto niektóre z powodów:

1) Obiekt nie jest gotowy do serializacji: jego aktualny stan wewnętrzny jest w trakcie zmiany.

2) Obiekt zawiera obiekty, których nie można serializować, ale może je przekształcić w formę, która może być łatwo serializowana, np. zapisać je jako tablicę bajtów lub coś innego.

3) Obiekt chce zdeserializować wszystkie swoje dane jako jedną jednostkę i/lub zaszyfrować je przed serializacją.

Istnieje wiele powodów, dla których możesz chcieć wykonać serializację ręcznie. Ale nie chcemy stracić wszystkich korzyści, jakie oferuje standardowa serializacja. W końcu nasz obiekt może używać innych obiektów. Jednak nie mogą one być serializowane, jeśli nasz obiekt nie obsługuje serializacji.

Istnieje rozwiązanie także i tej sytuacji: interfejs Externalizable. Musimy podziękować wizjonerskim twórcom Javy. Wystarczy zastąpić interfejs Serializable interfejsem Externalizable, a Twoja klasa będzie mogła ręcznie zarządzać procesem serializacji.

Interfejs Externalizable posiada dwie metody, których interfejs Serializable nie posiada, a które są wywoływane przez maszynę Java, gdy obiekt jest serializowany. Wygląda to tak:

Kod
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();
 }
}

Przypomina Ci to coś?

– Kurka wodna! Dokładnie tak próbowaliśmy zapisywać obiekty, zanim rozważyliśmy serializację.

– To wszystko upraszcza: jeśli standardowa serializacja jest wystarczająca, to po prostu dziedziczymy interfejs Serializable. Jeśli nie jest wystarczająca, wtedy dziedziczymy Externalizable i piszemy nasz własny kod, aby zapisać/wczytać nasz obiekt.

– Ale czy klasa oznaczona jako Externalizable jest uważana za serializowalną? Czy możemy użyć takiej klasy do „bezpiecznego” przechowywania odwołań do naszych klas serializowalnych?

– Tak. Jeśli klasa implementuje Serializable lub Externalizable, jest uważana za serializowalną.

– To idealne rozwiązanie. Podoba mi się.

– Miło mi to słyszeć. Ale to nie wszystko... Powinien Pan zapytać Profesora Hansa o wszystkie niuanse. One na pewno istnieją. Chciał dać Ci coś do przeczytania.