1. 程式人生 > >Java關鍵字——transient

Java關鍵字——transient

“transient”——“瞬態”,先不說這個翻譯是否恰當,這個變數關鍵字一直不曾使用,簡單的說就是被瞬態定義的變數不可序列號。或者這麼給他換個名字——“不可序列化狀態”?
打個比方,如果一個使用者有一些敏感資訊(譬如密碼,銀行卡號等),為了安全起見,不希望在網路操作(主要涉及到序列化操作,本地序列化快取也適用)中被傳輸。這些資訊對應的變數就可以被定義為transient型別。換句話說,這個欄位的生命週期僅存於呼叫者的記憶體中。
定義People
Java程式碼收藏程式碼
  1. publicclassPeopleimplementsSerializable{
  2. privatestaticfinallong
    serialVersionUID=8294180014912103005L;
  3. /**
  4. *使用者名稱
  5. */
  6. privateStringusername;
  7. /**
  8. *密碼
  9. */
  10. privatetransientStringpassword;
  11. }


密碼欄位為transient,這時候如果對該物件進行序列化,這個密碼欄位是不會被儲存的。
為了程式碼簡潔,未將流操作至於try-catch中,僅為演示,勿仿!
Java程式碼收藏程式碼
  1. publicstaticvoidmain(String[]args)throwsException{
  2. Peoplep=newPeople();
  3. p.setUsername("snowolf"
    );
  4. p.setPassword("123456");
  5. System.err.println("------操作前------");
  6. System.err.println("username:"+p.getUsername());
  7. System.err.println("password:"+p.getPassword());
  8. ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(
  9. "people.txt"));
  10. oos.writeObject(p);
  11. oos.flush();
  12. oos.close();
  13. ObjectInputStreamois=newObjectInputStream(newFileInputStream(
  14. "people.txt"));
  15. p=(People)ois.readObject();
  16. ois.close();
  17. System.err.println("------操作後------");
  18. System.err.println("username:"+p.getUsername());
  19. System.err.println("password:"+p.getPassword());
  20. }

執行操作:
引用 ------操作前------
username: snowolf
password: 123456
------操作後------
username: snowolf
password: null
密碼欄位為null,反序列化時根本沒有從檔案中獲取到資訊。
適用場景:
1.不打算序列化某欄位的值,節省空間
2.傳遞序列化流的時候,不傳遞該值等