Ключевое слово 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,
которое управляет доступом к коду из потоков