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;