– 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:
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.