Java中Transient關鍵字解釋
阿新 • • 發佈:2019-01-07
Java的serialization提供了一種持久化物件例項的機制。當持久化物件時,可能有一個特殊的物件資料成員,我們不想用serialization機制來儲存它。為了在一個特定物件的一個域上關閉serialization,可以在這個域前加上關鍵字transient。
transient是Java語言的關鍵字,用來表示一個域不是該物件序列化的一部分。當一個物件被序列化的時候,transient型變數的值不包括在序列化的表示中,然而非transient型的變數是被包括進去的。
如果我們執行這段程式碼,我們會注意到從磁碟中讀回(read——back (de-serializing))的物件列印password為"NOT SET"。這是當我們定義pwd域為transient時,所期望的正確結果。
現在,讓我們來看一下粗心對待transient域可能引起的潛在問題。假設我們修改了類定義,提供給transient域一個預設值,
transient是Java語言的關鍵字,用來表示一個域不是該物件序列化的一部分。當一個物件被序列化的時候,transient型變數的值不包括在序列化的表示中,然而非transient型的變數是被包括進去的。
首先,讓我們看一些Java serialization的程式碼:
現在我們建立一個這個類的例項,並且序列化(serialize)它 ,然後將這個序列化物件寫入磁碟。public class LoggingInfo implements java.io.Serializable { private Date loggingDate = new Date(); private String uid; private transient String pwd; LoggingInfo(String user, String password) { uid = user; pwd = password; } public String 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; } }
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS"); System.out.println(logInfo.toString()); try { ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("logInfo.out")); o.writeObject(logInfo); o.close(); } catch(Exception e) {//deal with exception} To read the object back, we can write try { ObjectInputStream in =new ObjectInputStream(new FileInputStream("logInfo.out")); LoggingInfo logInfo = (LoggingInfo)in.readObject(); System.out.println(logInfo.toString()); } catch(Exception e) {//deal with exception}
如果我們執行這段程式碼,我們會注意到從磁碟中讀回(read——back (de-serializing))的物件列印password為"NOT SET"。這是當我們定義pwd域為transient時,所期望的正確結果。
現在,讓我們來看一下粗心對待transient域可能引起的潛在問題。假設我們修改了類定義,提供給transient域一個預設值,
程式碼如下:
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS"); System.out.println(logInfo.toString()); try { ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("logInfo.out")); o.writeObject(logInfo); o.close(); } catch(Exception e) {//deal with exception} To read the object back, we can write try { ObjectInputStream in =new ObjectInputStream(new FileInputStream("logInfo.out")); LoggingInfo logInfo = (LoggingInfo)in.readObject(); System.out.println(logInfo.toString()); } catch(Exception e) {
//deal with exception
}
如果我們序列化GuestLoggingInfo的一個例項,將它寫入磁碟,並且再將它從磁碟中讀出,我們仍然看到讀回的物件列印password 為 "NOT SET"。當從磁碟中讀出某個類的例項時,實際上並不會執行這個類的建構函式,而是載入了一個該類物件的持久化狀態,並將這個狀態賦值給該類的另一個物件。