Transient (Java)

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Transient (нерезидент) — модификатор полей класса в языке Java. Отмеченные этим модификатором поля не записываются в поток байт при применении стандартного алгоритма сериализации. При десериализации объекта такие поля инициализируются значением по умолчанию.

Общая информация[править]

Существует ряд ситуаций, в которых необходимо использовать данный модификатор. Ниже представлены некоторые из них.

  • Поле класса Clazz, помеченного маркерным интерфейсом Serializable, является объектом несериализуемого класса (например, java.lang.Thread или java.sql.ResultSet). В этом случае попытка сериализовать объект класса Clazz приведёт к исключению java.io.NotSerializableException. Для корректной сериализации следует пометить несериализуемое поле как transient.
  • Значение поля класса может быть вычислено после десериализации на основании значений остальных полей. Примером является объект, который кэширует результаты внутренних вычислений. В этом случае из соображений экономии времени и трафика имеет смысл воздержаться от сериализации поля.
  • Значение поля корректно только в рамках текущего контекста. Например, поле, хранящее ссылку на родительскую фабрику иногда стоит пометить как transient.
  • Некоторые поля могут не сериализоваться из соображений безопасности, например, поле password некоторого класса User.

Поскольку статические поля класса не сериализуются, не имеет смысла одновременное использование модификаторов static и transient. Тем не менее, компилятор полагает такое сочетание корректным.

При использовании собственного алгоритма сериализации (реализации интерфейса Externalizable) логика описывается разработчиком, поэтому в этом случае модификатор transient является бесполезным.

Локальная переменная не хранит состояние объекта и не участвует в сериализации, поэтому она не может быть помечена модификатором transient.