Ответ
Интерфейс java.io.Serializable — это маркерный интерфейс, указывающий, что объекты класса могут быть сериализованы (преобразованы в последовательность байтов) и десериализованы.
Основные цели использования:
- Сохранение состояния объекта в файл или базу данных.
- Передача объекта по сети (например, в RPC, RMI или между микросервисами).
- Кэширование объектов вне JVM.
Ключевые аспекты:
-
serialVersionUID:
- Уникальный идентификатор версии сериализованного класса.
- Крайне важно объявлять его явно (
private static final long), чтобы избежать несовместимости при изменении класса, которая приведет кInvalidClassException.public class MyClass implements Serializable { private static final long serialVersionUID = 1L; // поля класса }
-
Транзиентные поля: Поля, помеченные модификатором
transient, не сериализуются. Это полезно для временных данных или конфиденциальной информации (например, паролей). -
Наследование: Если родительский класс реализует
Serializable, то и все его дочерние классы сериализуемы. Если родительский класс не сериализуем, он должен иметь конструктор по умолчанию (без аргументов), который будет вызван при десериализации дочернего объекта. -
Производительность и безопасность:
- Нативная сериализация Java может быть медленной и создавать большой объем данных.
- Для межсервисного взаимодействия предпочтительнее использовать форматы вроде JSON (Jackson/Gson) или Protocol Buffers.
- Десериализация ненадежных данных — угроза безопасности.
Best Practice: Используйте сериализацию только когда это необходимо (например, для HttpSession). Для передачи данных между системами выбирайте кросс-платформенные форматы.