Java transient關鍵字

Java的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,咱們不想  
用serialization機制來保存它。爲了在一個特定對象的一個域上關閉serialization,能夠在這個域前加上關鍵字transient。  
transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。  
注意static變量也是能夠串行化的

首先,讓咱們看一些Java serialization的代碼:  
publicclass LoggingInfo implements java.io.Serializable  
{  
private Date loggingDate =new Date();  
private String uid;  
privatetransient 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;  
   }

}


如今咱們建立一個這個類的實例,而且串行化(serialize)它 ,而後將這個串行化對象寫如磁盤。  

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域一個默認值,  
代碼以下:  

publicclass GuestLoggingInfo implements java.io.Serializable  
{  
private Date loggingDate =new Date();  
private String uid;  
privatetransient String pwd;  

   GuestLoggingInfo()  
{  
       uid
="guest";  
       pwd
="guest";  
   }

public String toString()  
{  
//same as above  
    }

}

如今,若是咱們穿行化GuestLoggingInfo的一個實例,將它寫入磁盤,而且再將它從磁盤中讀出,咱們仍然看到讀回的對象打印password 爲
"NOT SET"。當從磁盤中讀出某個類的實例時,實際上並不會執行這個類的構造函數,  
而是載入了一個該類對象的持久化狀態,並將這個狀態賦值給該類的另外一個對象。
java

相關文章
相關標籤/搜索