多读书多实践,勤思考善领悟

transient 关键字的作用?

本文于1807天之前发表,文中内容可能已经过时。

Java 语言规范中提到,transient 关键字用来说明指定属性不进行序列化.

若要理解 transient 关键字的作用,自然需要对序列化有一定的认识.

序列化

序列化是用来持久化对象的状态 – 将对象转化为字节码保存到指定的文件中.类似地,可以通过反序列化,将字节码还原为对象原有的状态.序列化是 Java 中一个比较重要的概念,因为在网络编程中会经常用到序列化与反序列化机制.一个相对若想在网络中传输,就必须转化为字节的形式.而 Serializable 接口就是用来标识某个类或接口可以转化为字节码,Serializable 可以认为是一个标识符,因为它没有任何的方法.

Serializable 允许我们将一个类转化为字节码,进而在网络传输.可是,一个类中可能存在某些敏感的信息,我们是不想在网络中传输的,这时候我们就需要借助 transient 关键字了.被 transient 关键字标识的 field,不会进行序列化.

下面通过一个例子说明 transient 关键字的作用.现假设我们需要在网络中传输 Person 类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Person implements Serializable{

private static final long serialVersionUID = 1L;

private String name;
private String certNo; // 身份证号码
private int age;

public Person(String name, String certNo, int age) {
this.name = name;
this.certNo = certNo;
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", certNo='" + certNo + '\'' +
", age=" + age +
'}';
}
}

若不使用 transient 关键字,反序列化时输出的信息是 :

1
Person{name='tianya', certNo='12314', age=23}

我们知道,身份证号码属于敏感信息,并不想在网络中传输,这时我们就可以借助 transient 关键字,如下:

1
private transient String certNo;

这个时候,通过反序列化获取的 Person 信息如下 :

1
Person{name='tianya', certNo='null', age=23}

stackoverflow原址:http://stackoverflow.com/questions/910374/why-does-java-have-transient-variables