海闊天空

          I'm on my way!
          隨筆 - 17, 文章 - 69, 評論 - 21, 引用 - 0
          數據加載中……

          java中的transient關鍵字

          在對象傳輸的情況下,有些域是"瞬時的",也就是說只與當前進程環境相關,出了這個進程就沒有意義了,這樣的域是"本地化的",沒有序列化的價值,標為瞬時態的.


          Java 的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,我們不想用serialization機 制來保存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。

          transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。

          首先,讓我們看一些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;
              }
          }

          現在我們創建一個這個類的實例,并且串行化(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域一個默認值,
          代碼如下:

          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
               }
          }
          現 在,如果我們串行化GuestLoggingInfo的一個實例,將它寫入磁盤,并且再將它從磁盤中讀出,我們仍然看到讀回的對象打印password 為 "NOT SET"。當從磁盤中讀出某個類的實例時,實際上并不會執行這個類的構造函數,而是載入了一個該類對象的持久化狀態,并將這個狀態賦值給該類的另一個對 象。





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


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

          主站蜘蛛池模板: 乌什县| 嘉定区| 印江| 绥芬河市| 马鞍山市| 烟台市| 阿勒泰市| 巩留县| 丰台区| 兰西县| 莆田市| 景德镇市| 泸溪县| 远安县| 临沂市| 瑞昌市| 翁牛特旗| 周宁县| 卢湾区| 米泉市| 英吉沙县| 平罗县| 县级市| 宜春市| 盘锦市| 民乐县| 宜丰县| 吉木萨尔县| 和林格尔县| 毕节市| 高碑店市| 赤水市| 邢台市| 卢氏县| 吴堡县| 花莲县| 普洱| 陇西县| 北辰区| 英吉沙县| 于田县|