transient 关键字小结

transient 关键字小结

薛定谔的汪

今天在牛客网刷题的时候,看到一道题是考trainsient关键字的。惭愧,学了这么久java,还不是很理解这个关键字,虽然在开发中很少遇到它,但却频频出现在面试、笔试题里。

一,transient 瞬态关键字的作用以及方法

众所周知,一个对象实现了Serializable接口就表示这个对象可以被序列化,可以进行网络传输。但是在实际情况中,我们并不想让对象的每个属性都序列化,如用户的密码,银行卡号等。不希望在网络传输(序列化到本地时也使用)中被传输,可以在这些属性前加一个transient 关键字。这样,这个属性就不可以随着对象一起序列化了。当然前提是实现Serializable接口时。

代码示例:

通过ObjectOutputStream和ObjectInputStream来实现序列化与反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package demo;

import java.io.Serializable;
/**
* @description:
* @author: Yakai Zheng
* @email: zhengyakai@aliyun.com
* @date: Create on 2017/11/10
* @version: 1.0
* @modify:
*/
public class User implements Serializable {
private static final long serialVersionUID = -229966308218809522L;

private String username;
private transient String password;
getset...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package demo;

import java.io.*;
/**
* @description:
* @author: Yakai Zheng
* @email: zhengyakai@aliyun.com
* @date: Create on 2017/11/10
* @version: 1.0
* @modify:
*/
public class TestTransient {

public static void main(String[] args) {

User user = new User();
user.setUsername("Yakai");
user.setPassword("123456");

System.err.println("序列化前:");
System.out.println("username: " + user.getUsername());
System.out.println("password: " + user.getPassword());

try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("I:/user.txt"));
//序列化对象至本地磁盘
os.writeObject(user);
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"I:/user.txt"));
// 从流中读取User的数据
user = (User) is.readObject();
is.close();
System.err.println("反序列化后: ");
System.out.println("username: " + user.getUsername());
System.out.println("password: " + user.getPassword());

} catch (Exception e) {
e.printStackTrace();
}
}
}

控制台打印:

1
2
3
4
5
6
序列化前:
username: Yakai
password: 123456
反序列化后:
username: Yakai
password: null

password是null,说明此属性未被序列化到磁盘里。

二,transient关键字使用总结:

通过查阅相关资料:

  1. 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
  2. transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
  3. 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。(静态属性存在于内存中)。
  4. 使用transient 配合Serializable来用。
  • Title: transient 关键字小结
  • Author: 薛定谔的汪
  • Created at : 2017-11-10 17:25:19
  • Updated at : 2023-11-17 19:37:37
  • Link: https://www.zhengyk.cn/2017/11/10/java/transient/
  • License: This work is licensed under CC BY-NC-SA 4.0.