Transient в Java
Last updated: 7 мая 2025 г.Как уже было сказано, при сериализации все поля сериализуемого объекта должны быть тоже Serializable.
Если какое-то поле сериализуемого объекта не Serializable и у нас нет доступа к нему для изменения (то есть мы не можем изменить какой-нибудь сторонний реализованный класс и добавить к нему implements Serializable), то можно просто это конкретное поле не сериализовать объявив его transient
. Тогда будут сериализованы все поля объекта кроме transient поля и это поле будет null
при десериализации.
Пример класса который не возможно сделать Serializable:
1import java.io.*;
2import java.util.*;
3
4// Представим что у нас нет доступа
5// к классу SomeNotSerializableClass
6// для его изменения, он где-то в другом месте
7// и поэтому мы не можем
8// дописать ему implements Serializable.
9// Но нам нужно сериализовать
10// обьект класса Person приведенного ниже
11// не смотря на то что в нем есть
12// поле класса SomeNotSerializableClass
13// который не Serializable
14class SomeNotSerializableClass {
15 private int someField;
16 SomeNotSerializableClass(int a){
17 someField=a;
18 }
19 int getSomeField(){ return someField;}
20}
Пример класса который будет сериализоваться/десериализоваться:
1import java.io.*;
2import java.util.*;
3
4// это класс будем сериализовать/десериализовать
5class Person implements Serializable{
6 private String name;
7 private int age;
8 private double height;
9 private boolean married;
10 // поле var ниже это поле класса о котором
11 // мы говорили выше, который не Serializable.
12 // Тогда можем просто не сериализовать его
13 // обьявив его transient, и в сериализованом обьекте
14 // класса Person поле var будет null.
15 private transient SomeNotSerializableClass var;
16 Person(String n, int a, double h, boolean m,
17 SomeNotSerializableClass var){
18 name=n; age=a; height=h; married=m; this.var=var;
19 }
20 String getName() {return name;}
21 int getAge() { return age;}
22 double getHeight(){return height;}
23 boolean getMarried(){return married;}
24 SomeNotSerializableClass getNotSerializable(){return var;}
25}
26
27public class TransientField {
28 public static void main(String[] args) {
29 // здесь обычная сериализация/десериализация
30
31 // сериализация
32 try(ObjectOutputStream oos =
33 new ObjectOutputStream(new FileOutputStream("person.dat")))
34 {
35 Person p = new Person("Sam", 33, 178, true,
36 new SomeNotSerializableClass(20));
37 oos.writeObject(p);
38 }
39 catch(Exception ex){
40 System.out.println(ex.getMessage());
41 }
42 // десериализация
43 try(ObjectInputStream ois =
44 new ObjectInputStream(new FileInputStream("person.dat")))
45 {
46 Person p=(Person)ois.readObject();
47 System.out.printf(
48 "Name: %s \t Age: %d \t Height: %f \t Married: %b \t ",
49 p.getName(), p.getAge(), p.getHeight(),
50 p.getMarried());
51 System.out.print("NotSerializableVariable: ");
52 System.out.print(p.getNotSerializable().getSomeField());
53 }
54 catch(Exception ex){
55 System.out.println(ex.getMessage());
56 }
57 }
58}
Вывод:

Как видим, объект был сериализован частично. Поле, которое не Serealizable пустое, то есть null.
Следующие уроки
Контроль совместимости классов с помощью SerialVersionUID
9
мин.
Сериализация Singleton без утраты его сути
8
мин.
Управляемая сериализация в Java: Externalizable
10
мин.