Java中transient关键字和对象的序列化有关。总结起来有如下几点:
- transient关键字只能修饰属性,而不能修饰类和方法。
- 被transient关键字修饰的属性不会被序列化。
- 一个静态(static)属性不管是否被transient修饰,均不能被序列化。
代码演示
定义一个pojo: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
48package com.lzumetal.serialize.entity;
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String username;
private transient String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
序列化和发序列化测试:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package com.lzumetal.serialize.jdk;
import com.lzumetal.serialize.entity.User;
import org.junit.Test;
import java.io.Serializable;
public class TransientTest implements Serializable {
public void test() {
User user = new User();
user.setId(10000L);
user.setUsername("admin");
user.setPassword("123456");
byte[] bytes = JdkSerializeUtil.serializeToBytes(user);
Object object = JdkSerializeUtil.deserializeFromBytes(bytes);
System.out.println(object);
}
}
执行单元测试方法,反序列化后得到结果为:1
User{id=10000, username='admin', password='null'}
可以看到被transient修饰的属性password
没有被序列化。
应用场景
- 比如一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络中被传输(网络传输一般是将对象序列化成byte数组,再将byte数组发序列化),这些信息对应的变量就可以加上transient关键字。