Serialization

Сериализация представляет процесс записи состояния объекта в поток, соответственно процесс извлечения или восстановления состояния объекта из потока называется десириализацией.

Serializable

Serializable - интерфейс маркер, отвечающий за возможность сериализации объекта, и его полей (поля должны быть так же Serializable)

Для Serializable не нужен конструктор для создания восстановления объекта. Он просто полностью восстановится из байтов, в отличии от Externalizable.

Warning

~ Однако если класс предок был несереализуемым, то этот суперкласс должен содержать доступный (public, protected) конструктор без параметров для инициализации полей.

Note

Сериализация через Serializable использует рефлексию.

transient

Ключевое слово для обозначения не сериализуемого поля. При десириализации такие поля == null.

Externalizable

Externalizable - интерфейс с двумя методами:

void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;

При этом ObjectOutput/ObjectInput - интерфейсы, предоставляющие способ последовательной записи информации об объекте и способ аналогичного последовательного чтения соответственно.

Note

Externalizable работает не через рефлексию

Warning

При использовании данного способа сериализации необходимо иметь публичный определенный конструктор по умолчанию.

В сравнении с Serializable объект не востанавливается из байтов, при восстановлении сначала будет создан объект с помощью конструктора в точке объявления, а затем в него будут записаны значения его полей из байтов, полученных при сериализации

Как Externalizable можно определить Serializable, добавив (не переопределив) в него методы writeObject() и readObject(). Но для того, чтобы они «работали» нужно точно соблюсти их сигнатуру:

void writeObject(ObjectOutputStream stream) throws IOException;
void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException;