Java基础-transient关键字

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
48
package 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;
}

@Override
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
23
package com.lzumetal.serialize.jdk;

import com.lzumetal.serialize.entity.User;
import org.junit.Test;

import java.io.Serializable;


public class TransientTest implements Serializable {


@Test
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关键字。
------ 本文完 ------