在阅读ArrayList类源码时,看到一个关键字 transient
平时基本没用过的,当时就是一脸懵逼啊,查阅了很多资料,才知道这个关键字和序列化有关系
首先看transient这个单词
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。transient说明一个属性是临时的,不会被序列化
对于Java序列化,当对某些变量我们不想对它进行序列化的时候就可以将此变量设置为transient
打个比方,如果一个用户有一些敏感信息(如账号密码)不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
简单的例子:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class TestOfTransient {
public static void main(String[] args) {
User user = new User();
user.setPassword("123456");
user.setName("UserName");
System.out.println("Name: " + user.getName());
System.err.println("password: " + user.getPassword());
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:/user.txt"));
os.writeObject(user); // 将User对象写进文件
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:/user.txt"));
user = (User) is.readObject(); // 从流中读取User的数据
is.close();
System.out.println("Name: " + user.getName());
System.err.println("password: " + user.getPassword());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出结果如下
密码字段为null,说明反序列化时根本没有从文件中获取到信息。
要点:
1.如果变量被transient修饰,它不再是对象持久化的一部分,该变量的内容在序列化后无法获取。
2.transient只能修饰变量,不能修饰类和方法