以前写过一篇序列化相关的文章,今天要讲的这个文件自transient也是跟序列化有关系的。可是,挺多人没有了解过该关键字甚至是不知道该关键字的存在。java
在Java中,当一个类实现了java.io.Serializable接口,即代表了该类能够被序列化。咱们能够把该类的属性序列化而后保存在外部,或者跟另一个jvm进行数据传递。可是,咱们是否想过,若是一个类包含隐私信息,如用户的密码等,那么这个属性就不可以被序列化到外部。固然,咱们能够在序列化以前手动set该值为null,可是最优雅的作法就是使用transient关键字。编程
在咱们不想序列化到外部的属性前面加上transient关键字,该属性将不会被序列化。app
假设咱们有User对象以下:jvm
@Data
public class User implements Serializable {
private String username;
private transient String password;
}
复制代码
经过序列化工具类序列化和反序列化:工具
@Test
public void test() {
User user = new User();
user.setUsername("happyjava");
user.setPassword("123456");
System.out.println("序列化以前:" + user.toString());
byte[] serialize = SerializationUtils.serialize(user);
User newUser = SerializationUtils.deserialize(serialize);
System.out.println("反序列化:" + newUser);
}
复制代码
运行结果以下:测试
经过结果能够看到,反序列化以后没有存在password字段,这反向的证实了序列化的时候没有把password参与到序列化中去。这正是transient关键字的用处。spa
可能有读者会想到,若是静态属性加上transient会怎么样?反序列化回来以后是否是该类的静态属性就编程null了?下面经过代码来验证下:code
给User添加属性count:cdn
private transient static int count;
复制代码
这是一个静态属性。对象
先把该属性设置为10,而后序列化、反序列化一个类,再查看该静态属性:
@Test
public void test() {
User user = new User();
User.setCount(10);
user.setUsername("happyjava");
user.setPassword("123456");
System.out.println("序列化以前:" + user.toString());
System.out.println("user count:"+User.getCount());
byte[] serialize = SerializationUtils.serialize(user);
User newUser = SerializationUtils.deserialize(serialize);
System.out.println("反序列化:" + newUser);
System.out.println("user count:" + User.getCount());
}
复制代码
输出结果以下:
从结果看,静态属性没有发生改变。其实,无论有没有加transient关键字,静态属性都不会被序列化。
1)一旦变量被transient修饰,变量将再也不是对象持久化的一部分。
2)transient关键字只能修饰变量,而不能修饰方法和类。
3)被transient关键字修饰的变量再也不能被序列化,一个静态变量无论是否被transient修饰,均不能被序列化。