Java中的transient关键字

今天刷面试题,碰到了一道这样的题:

  Java中的transient关键字

  上图中的transient关键字我第一次遇见,于是看了些博客,了解了它的用法。

transient关键字的作用:

  transient用来修饰类的成员属性,而被transient修饰的属性在对象被序列化时,不会进行序列化;

  所以transient关键字的作用就是让类的成员属性不被序列化。常用在没有必要进行序列化的属性之上,比如说一个矩形类有三个属性,分别为长、宽和面积,而面积可以通过长宽推导出来,所以如果需要序列化矩形类的对象,那这个面积属性可以不用序列化,其好处就是节约空间;

代码演示:

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.ObjectInputStream;
 5 import java.io.ObjectOutputStream;
 6 import java.io.Serializable;
 7 
 8 public class Test implements Serializable{
 9 
10     private Integer length;        //
11     private Integer width;        //
12     private transient Integer area;    //面积,使用transient修饰
13     
14     public Test() {
15     }
16     
17     public Test(Integer length, Integer width) {
18         this.length = length;
19         this.width = width;
20         this.area = length * width;
21     }
22 
23     public static void main(String[] args) throws IOException, IOException, ClassNotFoundException {
24         //创建对象
25         Test t = new Test(3, 4);
26         
27         //输出原对象
28         System.out.println(t);
29         
30         //创建对象输出流,将对象写入文件中
31         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file"));
32         oos.writeObject(t);
33         
34         //创建对象输入流
35         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file"));
36         //从文件中读取对象
37         Test t2 = (Test)ois.readObject();
38         
39         //输出反序列化得到的对象
40         System.out.println(t2);
41         
42         oos.close();
43         ois.close();
44     }
45 
46     @Override
47     public String toString() {
48         return "Test [length=" + length + ", width=" + width + ", area=" + area + "]";
49     }
50     
51 }

代码结果:

Java中的transient关键字

  可以看到,经过反序列化后,length和width的值未改变,而area为null,表示area并未被序列化。