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