Топ-100Transient в Java - CodOrbits
LogoCodOrbits

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

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

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

Transient в Java

Last updated: 7 мая 2025 г.

Как уже было сказано, при сериализации все поля сериализуемого объекта должны быть тоже Serializable.

Если какое-то поле сериализуемого объекта не Serializable и у нас нет доступа к нему для изменения (то есть мы не можем изменить какой-нибудь сторонний реализованный класс и добавить к нему implements Serializable), то можно просто это конкретное поле не сериализовать объявив его transient. Тогда будут сериализованы все поля объекта кроме transient поля и это поле будет null при десериализации.

Пример программы:

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

Вывод:

Как видим, объект был сериализован частично. Поле, которое не Serealizable пустое, то есть null.


Следующие уроки

Контроль совместимости классов с помощью SerialVersionUID

9
мин.

Similar Articles Icon
Divider

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

8
мин.

Similar Articles Icon
Divider

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

10
мин.

Similar Articles Icon