Java有個特點就是序列化,簡單地來說就是可以将這個類存儲在實體空間(當然還是以檔案的形式存在),那麼當你從本地還原這個檔案時,你可以将它轉換為它本身。這可以極大地友善網絡上的一些操作,但同時,因為涉及到安全問題,是以并不希望把類裡面所有的東西都能存儲(因為那樣,别人可以通過序列化知道類裡面的内容),那麼我們就可以用上transient這個關鍵字,它的意思是臨時的,即不會随類一起序列化到本地,是以當還原後,這個關鍵字定義的變量也就不再存在。
通常,我們寫的程式都要求特定資訊能持久存在或儲存到磁盤上,以供一個程式使用或用在同一個程式的另一次運作上.這種持久性可以通過幾種方式來實作,包括寫到資料庫中或是利用JAVA為對象序列化提供的支援.不管我們選用什麼方法,類執行個體的持久性都是通過儲存類的域的狀态來完成的,儲存這些狀态,以便以後可以對它們進行通路或使用它們來建立相同的執行個體.然而,有可能并不是所有的域都需要被儲存起來.當一個執行個體被持久化時,其内部的一些域卻不需要持久化,則可以用trainsient修飾符告訴編譯器指定的域不需要被持久儲存.
Java的serialization提供了一種持久化對象執行個體的機制。當持久化對象時,可能有一個特殊的對象資料成員,我們不想 用serialization機制來儲存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。
首先,讓我們看一些Javaserialization的代碼:

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)它 ,然後将這個串行化對象寫如磁盤。

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域一個預設值,
代碼如下:

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"。
當從磁盤中讀出某個類的執行個體時,實際上并不會執行這個類的構造函數,
而是載入了一個該類對象的持久化狀态,并将這個狀态指派給該類的另一個對象。