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.