Java中transient關鍵字的應用
阿新 • • 發佈:2019-02-14
今天跟JDK原始碼的時候發現transient ,感覺從來沒見過,於是用google查了一下.
Java語言的關鍵字,用來表示一個域不是該物件序列化的一部分。當一個物件被序列化的時候,transient型變數的值不包括在序列化的表示中,然而非transient型的變數是被包括進去的。
下面我們查建立一個LoginFile的類:
public class LoginFile implements Serializable{ private static final long serialVersionUID = 1L; private String name = null; private transient String pwd = null; public LoginFile() { name = "shirdey"; pwd = "654321"; } public String toString(){ return "ClassName:LoginFile" +"\nname = "+name +"\npwd = "+pwd; } }
然後初始化LoginFile物件,將該物件寫到硬碟上:
LoginFile loginFile = new LoginFile(); System.out.println(loginFile.toString()); try { ObjectOutputStream outputStream = new ObjectOutputStream (new FileOutputStream("login.out")); outputStream.writeObject(loginFile); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); }
此時開啟login.out檔案看不到pwd欄位沒,然後我們通過讀取login.out測試一下:
try {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("login.out"));
LoginFile loginFile = (LoginFile) inputStream.readObject();
System.out.println(loginFile.toString());
} catch (Exception e) {
}
output:
ClassName:LoginFile name = shirdey pwd = null
很明顯,被transient修改的pwd欄位並沒有被儲存在硬碟
當序列化某個物件時,如果該物件的某個變數是transient,那麼這個變數不會被序列化進去。也就是說,假設某個類的成員變數是transient,那麼當通過ObjectOutputStream把這個類的某個例項
儲存到磁碟上時,實際上transient變數的值是不會儲存的。因為當從磁碟中讀出這個物件的時候,物件的該變數會沒有被賦值。
另外這篇文章還提到,當從磁碟中讀出某個類的例項時,實際上並不會執行這個類的建構函式,而是讀取這個類的例項的狀態,並且把這個狀態付給這個類的物件。這點我以前似乎不知道。