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 49
| 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 24 25
| 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关键字。