transient译作临时的,瞬态的意思,指的是在序列化的时候,被该关键字修饰的变量将不会被持久化。
比如用户的密码,身份证号,当希望将其保存到文件而又过滤掉这些敏感信息时,就可以使用该关键字修饰。
说道序列化,需要说明的是,static关键字不会被被序列化也不会被反序列化,因为static是类成员,在反序列化时(其实等同于初始化),就会使用类里的初始值,然而需要注意的是,内存中如果已经存在该类,且该类的该静态变量已经赋予了新值,则被序列化的类就会使用新的值。
下面的参考例子出自Java transient关键字使用小记:
public class Test01{
public static void main(String[] args){
User user = new User();
user.setUsername("Alexia");
user.setPasswd("123456");
System.out.println("read before Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:\\Users\\xxx\\Desktop/user.txt"));
os.writeObject(user); // 将User对象写进文件
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
// 在反序列化之前改变username的值
//User.username = "jiang";
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:\\Users\\xxx\\Desktop/user.txt"));
user = (User) is.readObject(); // 从流中读取User的数据
is.close();
System.out.println("\nread after Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class User implements Serializable {
private static final long serialVersionUID = 8294180014912103005L;
public static String username;
private transient String passwd;
public String getUsername() {return username;}
public void setUsername(String username) {this.username = username;}
public String getPasswd() {return passwd;}
public void setPasswd(String passwd) {this.passwd = passwd;}
}