РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
34 of 1163 menu

Ключевое слово transient

Ключевое слово transient применяется к полям класса и указывает виртуальной машине Java, что это поле не нужно сохранять при сериализации объекта. При десериализации такое поле получит значение по умолчанию: 0 для чисел, false для boolean, null для ссылочных типов. Ключевое слово указывается в объявлении поля перед типом данных.

Синтаксис

transient тип имяПоля;

Пример

Давайте создадим класс с обычным полем и полем, помеченным transient, и посмотрим, как они ведут себя при сериализации:

import java.io.*; public class Main { public static void main(String[] args) throws Exception { User user = new User("abcde", "12345"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(user); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); User res = (User) ois.readObject(); ois.close(); System.out.println(res.getName()); System.out.println(res.getPassword()); } } class User implements Serializable { private String name; private transient String password; public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public String getPassword() { return password; } }

Результат выполнения кода:

"abcde" null

Как видите, поле name сохранилось, а поле password после десериализации стало null, потому что оно помечено как transient.

Пример

Давайте посмотрим, какое значение получит transient-поле примитивного типа после десериализации:

import java.io.*; public class Main { public static void main(String[] args) throws Exception { Counter counter = new Counter(12345); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(counter); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); Counter res = (Counter) ois.readObject(); ois.close(); System.out.println(res.getValue()); } } class Counter implements Serializable { private transient int value; public Counter(int value) { this.value = value; } public int getValue() { return value; } }

Результат выполнения кода:

0

Примитивное transient-поле после десериализации получило значение по умолчанию, то есть 0.

Смотрите также

  • ключевое слово static,
    которое относится к классу, а не к объекту
  • ключевое слово final,
    которое запрещает изменение поля
  • ключевое слово volatile,
    которое управляет видимостью поля в потоках
  • ключевое слово synchronized,
    которое управляет доступом к коду из потоков
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить