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.

Схожі статті