海闊天空

          I'm on my way!
          隨筆 - 17, 文章 - 69, 評(píng)論 - 21, 引用 - 0
          數(shù)據(jù)加載中……

          java中的transient關(guān)鍵字

          在對(duì)象傳輸?shù)那闆r下,有些域是"瞬時(shí)的",也就是說(shuō)只與當(dāng)前進(jìn)程環(huán)境相關(guān),出了這個(gè)進(jìn)程就沒(méi)有意義了,這樣的域是"本地化的",沒(méi)有序列化的價(jià)值,標(biāo)為瞬時(shí)態(tài)的.


          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ì) 象。





          摘自:http://www.devx.com/tips/Tip/13726


          posted on 2009-07-23 19:25 石頭@ 閱讀(405) 評(píng)論(0)  編輯  收藏 所屬分類: java_base

          主站蜘蛛池模板: 沽源县| 丘北县| 西峡县| 汉阴县| 习水县| 金堂县| 疏附县| 霍邱县| 丁青县| 昂仁县| 江西省| 大兴区| 北票市| 鸡东县| 海林市| 姜堰市| 德惠市| 浦江县| 邹平县| 仪征市| 孝义市| 乌审旗| 新平| 宁远县| 云霄县| 突泉县| 祁连县| 广东省| 禄劝| 安丘市| 尖扎县| 衡阳市| 青龙| 临武县| 孟连| 邳州市| 金乡县| 镇雄县| 东光县| 翁源县| 柳江县|