Топ-100Transient в Java
LogoCodOrbits

Раздел: Сериализация

Узнайте, как сериализовать и десериализовать объекты в Java для сохранения состояния и передачи данных.

Все разделы
Иконка Сериализация

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
мин.

Similar Articles Icon
Divider

Сериализация Singleton без утраты его сути

8
мин.

Similar Articles Icon
Divider

Управляемая сериализация в Java: Externalizable

10
мин.

Similar Articles Icon