Skip to content

Commit 94fcbf2

Browse files
committed
transient 关键字的作用
1 parent e29dba3 commit 94fcbf2

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# transient 关键字的作用?
2+
3+
[Java 语言规范](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.3)中提到,transient 关键字用来说明指定属性不进行序列化.
4+
5+
若要理解 transient 关键字的作用,自然需要对序列化有一定的认识.
6+
7+
** 序列化 **
8+
9+
序列化是用来持久化对象的状态 -- 将对象转化为字节码保存到指定的文件中.类似地,可以通过反序列化,将字节码还原为对象原有的状态.序列化是 Java 中一个比较重要的概念,因为在网络编程中会经常用到序列化与反序列化机制.一个相对若想在网络中传输,就必须转化为字节的形式.而 Serializable 接口就是用来标识某个类或接口可以转化为字节码,Serializable 可以认为是一个标识符,因为它没有任何的方法.
10+
11+
Serializable 允许我们将一个类转化为字节码,进而在网络传输.可是,一个类中可能存在某些敏感的信息,我们是不想起网络中传输的,这时候我们就需要借助 transient 关键字了.被 transient 关键字标识的 field,不会进行序列化.
12+
13+
下面通过一个例子说明 transient 关键字的作用.现假设我们需要在网络中传输 Person 类:
14+
```
15+
public class Person implements Serializable{
16+
17+
private static final long serialVersionUID = 1L;
18+
19+
private String name;
20+
private String certNo; // 身份证号码
21+
private int age;
22+
23+
public Person(String name, String certNo, int age) {
24+
this.name = name;
25+
this.certNo = certNo;
26+
this.age = age;
27+
}
28+
29+
@Override
30+
public String toString() {
31+
return "Person{" +
32+
"name='" + name + '\'' +
33+
", certNo='" + certNo + '\'' +
34+
", age=" + age +
35+
'}';
36+
}
37+
}
38+
```
39+
40+
若不使用 transient 关键字,反序列化时输出的信息是 :
41+
```
42+
Person{name='tianya', certNo='12314', age=23}
43+
```
44+
45+
我们知道,身份证号码属于敏感信息,并不想在网络中传输,这时我们就可以借助 transient 关键字,如下:
46+
```
47+
private transient String certNo;
48+
```
49+
50+
这个时候,通过反序列化获取的 Person 信息如下 :
51+
```
52+
Person{name='tianya', certNo='null', age=23}
53+
```
54+
55+
stackoverflow原址:http://stackoverflow.com/questions/910374/why-does-java-have-transient-variables

0 commit comments

Comments
 (0)