關(guān)于transient的理解

我們知道在java中,我們要將一個對象序列化以后,再將其反序列化以后就可以得到之前序列化之前的內(nèi)容.但是,假如我們有時并不是想讓某個類的所有的成員變量都要被序列化,那怎么辦呢?其中一種方法是使用靜態(tài)static來修飾,另外一種就是今天要說的transient這個關(guān)鍵字.

  • transient關(guān)鍵字能實現(xiàn)什么?
    當(dāng)對象被序列化時(寫入字節(jié)序列到目標(biāo)文件)時顶燕,transient阻止實例中那些用此關(guān)鍵字聲明的變量持久化族操;當(dāng)對象被反序列化時(從源文件讀取字節(jié)序列進行,這樣的實例變量值不會被持久化和恢復(fù)。例如琅豆,當(dāng)反序列化對象——數(shù)據(jù)流(例如继谚,文件)可能不存在時,原因是你的對象中存在類型為java.io.InputStream的變量畴椰,序列化時這些變量引用的輸入流無法被打開。

  • 如何使用transient鸽粉?
    下面是一個小小的例子來簡要說明一下,就直接上代碼了:

      package com.rain.trainsent;
    
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.io.Serializable;
      import java.util.ArrayList;
    
      public class TestTransient {
    
          public static void main(String[] args) throws FileNotFoundException, IOException {
              // TODO Auto-generated method stub
      
              Student s = new Student("zhangsan",12);
              System.out.println(s.toString());
              //序列化 被設(shè)置為transient 沒有被序列化進去
              ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("student.txt"));
              o.writeObject(s);
              o.close();
    
              //重新讀取序列化的內(nèi)容
              ObjectInputStream in = new ObjectInputStream(new FileInputStream("student.txt"));
      
              try {
                  Student stu = (Student) in.readObject();
                  System.out.println(stu.toString());
              } catch (ClassNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }
      }
      class Student implements Serializable{
          private transient String name;
          private  int id;
          public Student(String name, int id) {
              super();
              this.name = name;
              this.id = id;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public int getId() {
              return id;
          }
          public void setId(int id) {
              this.id = id;
          }
          @Override
          public String toString() {
              return "Student [name=" + name + ", id=" + id + "]";
        }
    
      }
    

    可以看到,當(dāng)我們將這個類的name屬性用transient修飾后,當(dāng)我們將其序列化以后,反序列化的時候就得不到它之前的值了

  • transient使用細節(jié)——被transient關(guān)鍵字修飾的變量真的不能被序列化嗎斜脂?
    看一下下面的一個例子:

      package com.rain.test;
      import java.io.Externalizable;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.ObjectInput;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutput;
      import java.io.ObjectOutputStream;
    
      public class TestTransient implements Externalizable {
    
          private transient String content="我會被序列化的,不管我有沒有被transient修飾";
    
          public static void main(String[] args) throws ClassNotFoundException, IOException {
              TestTransient et = new TestTransient();
      
              ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
                      new File("test")));
              out.writeObject(et);
    
              ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
                    "test")));
              et = (TestTransient) in.readObject();
              System.out.println(et.content);
    
              out.close();
              in.close();
    
          }
    
          @Override
          public void writeExternal(ObjectOutput out) throws IOException {
              out.writeObject(content);
          }
    
          @Override
          public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
              content = (String) in.readObject();
      
        }
    
    }
    

    我們知道在Java中,對象的序列化可以通過實現(xiàn)兩種接口來實現(xiàn)潜叛,若實現(xiàn)的是Serializable接口秽褒,則所有的序列化將會自動進行壶硅,若實現(xiàn)的是Externalizable接口,則沒有任何東西可以自動序列化销斟,需要在writeExternal方法中進行手工指定所要序列化的變量庐椒,這與是否被transient修飾無關(guān).因此第二個例子輸出的是變量content初始化的內(nèi)容,而不是null.以上是個人對關(guān)鍵字transient的一些理解,希望能起到拋磚引玉的作用.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚂踊,一起剝皮案震驚了整個濱河市约谈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犁钟,老刑警劉巖棱诱,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涝动,居然都是意外死亡迈勋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門醋粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靡菇,“玉大人,你說我怎么就攤上這事米愿∠梅铮” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵育苟,是天一觀的道長较鼓。 經(jīng)常有香客問我,道長违柏,這世上最難降的妖魔是什么博烂? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮漱竖,結(jié)果婚禮上脖母,老公的妹妹穿的比我還像新娘。我一直安慰自己闲孤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布烤礁。 她就那樣靜靜地躺著讼积,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脚仔。 梳的紋絲不亂的頭發(fā)上勤众,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音鲤脏,去河邊找鬼们颜。 笑死吕朵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窥突。 我是一名探鬼主播努溃,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阻问!你這毒婦竟也來了梧税?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤称近,失蹤者是張志新(化名)和其女友劉穎第队,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刨秆,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凳谦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衡未。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尸执。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖眠屎,靈堂內(nèi)的尸體忽然破棺而出剔交,到底是詐尸還是另有隱情,我是刑警寧澤改衩,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布岖常,位于F島的核電站,受9級特大地震影響葫督,放射性物質(zhì)發(fā)生泄漏竭鞍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一橄镜、第九天 我趴在偏房一處隱蔽的房頂上張望偎快。 院中可真熱鬧,春花似錦洽胶、人聲如沸晒夹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐怯。三九已至,卻和暖如春翔横,著一層夾襖步出監(jiān)牢的瞬間读跷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工禾唁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留效览,地道東北人无切。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像丐枉,于是被迫代替她去往敵國和親哆键。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容