java中的transient關(guān)鍵字
Java 的serialization提供了一種持久化對(duì)象實(shí)例的機(jī)制。當(dāng)持久化對(duì)象時(shí),可能有一個(gè)特殊的對(duì)象數(shù)據(jù)成員,我們不想用serialization機(jī) 制來(lái)保存它。為了在一個(gè)特定對(duì)象的一個(gè)域上關(guān)閉serialization,可以在這個(gè)域前加上關(guān)鍵字transient。
transient是Java語(yǔ)言的關(guān)鍵字,用來(lái)表示一個(gè)域不是該對(duì)象串行化的一部分。當(dāng)一個(gè)對(duì)象被串行化的時(shí)候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進(jìn)去的。
首先,讓我們看一些Java serialization的代碼:
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;
}
}
現(xiàn)在我們創(chuàng)建一個(gè)這個(gè)類的實(shí)例,并且串行化(serialize)它 ,然后將這個(gè)串行化對(duì)象寫(xiě)入磁盤(pán)。
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}
如果我們運(yùn)行這段代碼,我們會(huì)注意到從磁盤(pán)中讀回(read——back (de-serializing))的對(duì)象打印password為"NOT SET"。這是當(dāng)我們定義pwd域?yàn)閠ransient時(shí),所期望的正確結(jié)果。
現(xiàn)在,讓我們來(lái)看一下粗心對(duì)待transient域可能引起的潛在問(wèn)題。假設(shè)我們修改了類定義,提供給transient域一個(gè)默認(rèn)值,
代碼如下:
public class GuestLoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
}
public String toString()
{
//same as above
}
}
現(xiàn)
在,如果我們串行化GuestLoggingInfo的一個(gè)實(shí)例,將它寫(xiě)入磁盤(pán),并且再將它從磁盤(pán)中讀出,我們?nèi)匀豢吹阶x回的對(duì)象打印password
為 "NOT
SET"。當(dāng)從磁盤(pán)中讀出某個(gè)類的實(shí)例時(shí),實(shí)際上并不會(huì)執(zhí)行這個(gè)類的構(gòu)造函數(shù),而是載入了一個(gè)該類對(duì)象的持久化狀態(tài),并將這個(gè)狀態(tài)賦值給該類的另一個(gè)對(duì)
象。
posted on 2009-07-23 19:25 石頭@ 閱讀(405) 評(píng)論(0) 編輯 收藏 所屬分類: java_base