哎,雖然自己最熟的是Java,但很多Java基礎知識都不知道,比如transient關鍵字以前都沒用到過,是以不知道它的作用是什麼,今天做筆試題時發現有一題是關于這個的,于是花個時間整理下transient關鍵字的使用,漲下姿勢~~~好了,廢話不多說,下面開始:
我們都知道一個對象隻要實作了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關系具體序列化的過程,隻要這個類實作了Serilizable接口,這個類的所有屬性和方法都會自動序列化。
然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個使用者有一些敏感資訊(如密碼,銀行卡号等),為了安全起見,不希望在網絡操作(主要涉及到序列化操作,本地序列化緩存也适用)中被傳輸,這些資訊對應的變量就可以加上transient關鍵字。換句話說,這個字段的生命周期僅存于調用者的記憶體中而不會寫到磁盤裡持久化。
總之,java 的transient關鍵字為我們提供了便利,你隻需要實作Serilizable接口,将不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
示例code如下:

View Code
輸出為:
密碼字段為null,說明反序列化時根本沒有從檔案中擷取到資訊。
1)一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。
2)transient關鍵字隻能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是使用者自定義類變量,則該類需要實作Serializable接口。
3)被transient關鍵字修飾的變量不再能被序列化,一個靜态變量不管是否被transient修飾,均不能被序列化。
第三點可能有些人很迷惑,因為發現在User類中的username字段前加上static關鍵字後,程式運作結果依然不變,即static類型的username也讀出來為“Alexia”了,這不與第三點說的沖突嗎?實際上是這樣的:第三點确實沒錯(一個靜态變量不管是否被transient修飾,均不能被序列化),反序列化後類中static型變量username的值為目前JVM中對應static變量的值,這個值是JVM中的不是反序列化得出的,不相信?好吧,下面我來證明:

運作結果為:
這說明反序列化後類中static型變量username的值為目前JVM中對應static變量的值,為修改後jmwang,而不是序列化時的值Alexia。
思考下面的例子:
content變量會被序列化嗎?好吧,我把答案都輸出來了,是的,運作結果就是:
這是為什麼呢,不是說類的變量被transient關鍵字修飾以後将不能序列化了嗎?
我們知道在Java中,對象的序列化可以通過實作兩種接口來實作,若實作的是Serializable接口,則所有的序列化将會自動進行,若實作的是Externalizable接口,則沒有任何東西可以自動序列化,需要在writeExternal方法中進行手工指定所要序列化的變量,這與是否被transient修飾無關。是以第二個例子輸出的是變量content初始化的内容,而不是null。
作者:Alexia(minmin)
如果您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】
如果您希望與我交流互動,歡迎微網誌互粉
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。