1. 程式人生 > >Java中transient關鍵字的應用

Java中transient關鍵字的應用

  今天跟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變數的值是不會儲存的。因為當從磁碟中讀出這個物件的時候,物件的該變數會沒有被賦值。
    另外這篇文章還提到,當從磁碟中讀出某個類的例項時,實際上並不會執行這個類的建構函式,而是讀取這個類的例項的狀態,並且把這個狀態付給這個類的物件。這點我以前似乎不知道。