Вопрос проверяет понимание того, как работает стандартная сериализация и какие ограничения она накладывает на поля класса.
Стандартный механизм Serializable не сериализует поля, помеченные ключевым словом transient. Также не сериализуются поля, типы которых сами не поддерживают сериализацию. Статические поля не входят в состояние объекта и тоже не сохраняются. Если сериализуемый объект содержит несериализуемые поля, возникнет NotSerializableException. Эти ограничения важно учитывать при проектировании классов.
При стандартной сериализации Java сохраняет состояние объекта, то есть значения его нестатических полей, если они допускают сериализацию.
Перед тем как сериализовать объект, важно понимать, какие поля будут проигнорированы.
transient поля
Поля, помеченные transient, исключаются из сериализации.
class User implements Serializable {
private String name;
private transient String password;
}
После десериализации:
name восстановится
password будет иметь значение по умолчанию (null)
transientхранение временных данных
чувствительная информация (пароли, токены)
вычисляемые значения
Поля несериализуемых типов
Если поле содержит объект, который не реализует Serializable, сериализация завершится ошибкой.
class Wrapper implements Serializable {
private Thread thread; // Thread не Serializable
}
Результат — NotSerializableException.
Статические поляstatic поля:
принадлежат классу
не являются частью состояния объекта
не сериализуются
Стандартная сериализация работает только с нестатическими и сериализуемыми полями. Для исключения данных используется transient.