Сериализация – это сохранение типа и состояния объекта в бинарном виде для последующего сохранения/передачи и десериализации. Для сериализации используется интерфейс
Serializable (
Externalizable), и цель записи/источник чтения
ObjectInputStream/
ObjectOutputStream (
ObjectInput/
ObjectOutput).
Класс сериализуем, если:
🔘 Реализует
маркерный интерфейс
Serializable;
🔘 Все поля сериализуемые или помечены
модификатором transient (иначе рантайм выбросит
NotSerializableException).
Протокол стандартной сериализации описан
в документации.
Сериализационная форма может, и в некоторых случаях для корректной работы должна быть кастомизирована. Правильная форма содержит
только логическое представление данных, без деталей о физической реализации.
Для описания полей сериализационной формы в javadoc-документации используется тег
@serial. Для документации генерирующего нестандартную сериализационную форму метода используется
@serialData. Эти теги имеют смысл и для приватных членов, так как эффективно такие члены – часть публичного API.
Нестатические внутренние классы не должны быть сериализуемыми. Статические поля как поля класса а не инстанса несериализуемы.
Сериализации посвящен целый раздел
Effective Java.
Доклад для ознакомления с темой.