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