天天看點

java transient作用_java中transient關鍵字的作用

Java有個特點就是序列化,簡單地來說就是可以将這個類存儲在實體空間(當然還是以檔案的形式存在),那麼當你從本地還原這個檔案時,你可以将它轉換為它本身。這可以極大地友善網絡上的一些操作,但同時,因為涉及到安全問題,是以并不希望把類裡面所有的東西都能存儲(因為那樣,别人可以通過序列化知道類裡面的内容),那麼我們就可以用上transient這個關鍵字,它的意思是臨時的,即不會随類一起序列化到本地,是以當還原後,這個關鍵字定義的變量也就不再存在。

通常,我們寫的程式都要求特定資訊能持久存在或儲存到磁盤上,以供一個程式使用或用在同一個程式的另一次運作上.這種持久性可以通過幾種方式來實作,包括寫到資料庫中或是利用JAVA為對象序列化提供的支援.不管我們選用什麼方法,類執行個體的持久性都是通過儲存類的域的狀态來完成的,儲存這些狀态,以便以後可以對它們進行通路或使用它們來建立相同的執行個體.然而,有可能并不是所有的域都需要被儲存起來.當一個執行個體被持久化時,其内部的一些域卻不需要持久化,則可以用trainsient修飾符告訴編譯器指定的域不需要被持久儲存.

Java的serialization提供了一種持久化對象執行個體的機制。當持久化對象時,可能有一個特殊的對象資料成員,我們不想 用serialization機制來儲存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。

首先,讓我們看一些Javaserialization的代碼:

java transient作用_java中transient關鍵字的作用
java transient作用_java中transient關鍵字的作用

public class LoggingInfo implementsjava.io.Serializable

{private Date loggingDate = newDate();privateString uid;private transientString pwd;

LoggingInfo(String user, String password)

{

uid=user;

pwd=password;

}publicString toString()

{

String password=null;if(pwd == null)

{

password= "NOT SET";

}else{

password=pwd;

}return "logon info: /n " + "user: " + uid +

"/n logging date : " + loggingDate.toString() +

"/n password: " +password;

}

}

serialization

現在我們建立一個這個類的執行個體,并且串行化(serialize)它 ,然後将這個串行化對象寫如磁盤。

java transient作用_java中transient關鍵字的作用
java transient作用_java中transient關鍵字的作用

LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");

System.out.println(logInfo.toString());try{

ObjectOutputStream o= newObjectOutputStream(new FileOutputStream("logInfo.out"));

o.writeObject(logInfo);

o.close();

}catch(Exception e) {//deal with exception}

To read the object back, we can writetry{

ObjectInputStream in=newObjectInputStream(new FileInputStream("logInfo.out"));

LoggingInfo logInfo=(LoggingInfo)in.readObject();

System.out.println(logInfo.toString());

}catch(Exception e) {//deal with exception

}

serialize

如果我們運作這段代碼,我們會注意到從磁盤中讀回(read——back (de-serializing))的對象列印password為"NOT SET"。這是當我們定義pwd域為transient時,所期望的正确結果。

現在,讓我們來看一下粗心對待transient域可能引起的潛在問題。假設我們修改了類定義,提供給transient域一個預設值,

代碼如下:

java transient作用_java中transient關鍵字的作用
java transient作用_java中transient關鍵字的作用

public class GuestLoggingInfo implementsjava.io.Serializable

{private Date loggingDate = newDate();privateString uid;private transientString pwd;

GuestLoggingInfo()

{

uid= "guest";

pwd= "guest";

}publicString toString()

{//same as above

}

}

transient

現在,如果我們穿行化GuestLoggingInfo的一個執行個體,将它寫入磁盤,并且再将它從磁盤中讀出,我們仍然看到讀回的對象列印password 為 "NOT SET"。

當從磁盤中讀出某個類的執行個體時,實際上并不會執行這個類的構造函數,

而是載入了一個該類對象的持久化狀态,并将這個狀态指派給該類的另一個對象。