Java關鍵字——transient
阿新 • • 發佈:2019-01-24
“transient”——“瞬態”,先不說這個翻譯是否恰當,這個變數關鍵字一直不曾使用,簡單的說就是被瞬態定義的變數不可序列號。或者這麼給他換個名字——“不可序列化狀態”?
打個比方,如果一個使用者有一些敏感資訊(譬如密碼,銀行卡號等),為了安全起見,不希望在網路操作(主要涉及到序列化操作,本地序列化快取也適用)中被傳輸。這些資訊對應的變數就可以被定義為transient型別。換句話說,這個欄位的生命週期僅存於呼叫者的記憶體中。
定義People
Java程式碼
密碼欄位為transient,這時候如果對該物件進行序列化,這個密碼欄位是不會被儲存的。
為了程式碼簡潔,未將流操作至於try-catch中,僅為演示,勿仿!
Java程式碼
執行操作:
引用 ------操作前------
username: snowolf
password: 123456
------操作後------
username: snowolf
password: null
密碼欄位為null,反序列化時根本沒有從檔案中獲取到資訊。
適用場景:
1.不打算序列化某欄位的值,節省空間
2.傳遞序列化流的時候,不傳遞該值等
打個比方,如果一個使用者有一些敏感資訊(譬如密碼,銀行卡號等),為了安全起見,不希望在網路操作(主要涉及到序列化操作,本地序列化快取也適用)中被傳輸。這些資訊對應的變數就可以被定義為transient型別。換句話說,這個欄位的生命週期僅存於呼叫者的記憶體中。
定義People
Java程式碼
- publicclassPeopleimplementsSerializable{
-
privatestaticfinallong
- /**
- *使用者名稱
- */
- privateStringusername;
- /**
- *密碼
- */
- privatetransientStringpassword;
- }
密碼欄位為transient,這時候如果對該物件進行序列化,這個密碼欄位是不會被儲存的。
為了程式碼簡潔,未將流操作至於try-catch中,僅為演示,勿仿!
Java程式碼
- publicstaticvoidmain(String[]args)throwsException{
- Peoplep=newPeople();
-
p.setUsername("snowolf"
- p.setPassword("123456");
- System.err.println("------操作前------");
- System.err.println("username:"+p.getUsername());
- System.err.println("password:"+p.getPassword());
- ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(
- "people.txt"));
- oos.writeObject(p);
- oos.flush();
-
oos.close();
- ObjectInputStreamois=newObjectInputStream(newFileInputStream(
- "people.txt"));
- p=(People)ois.readObject();
- ois.close();
- System.err.println("------操作後------");
- System.err.println("username:"+p.getUsername());
- System.err.println("password:"+p.getPassword());
- }
執行操作:
引用 ------操作前------
username: snowolf
password: 123456
------操作後------
username: snowolf
password: null
密碼欄位為null,反序列化時根本沒有從檔案中獲取到資訊。
適用場景:
1.不打算序列化某欄位的值,節省空間
2.傳遞序列化流的時候,不傳遞該值等