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 }
代码结果:
可以看到,经过反序列化后,length和width的值未改变,而area为null,表示area并未被序列化。