1. transient的作用及使用方法
我們都知道一個對象只要實現(xiàn)了Serilizable接口责语,這個對象就可以被序列化念颈,java的這種序列化模式為開發(fā)者提供了很多便利,我們可以不必關(guān)系具體序列化的過程最域,只要這個類實現(xiàn)了Serilizable接口莽囤,這個類的所有屬性和方法都會自動序列化五嫂。
然而在實際開發(fā)過程中苞冯,我們常常會遇到這樣的問題袖牙,這個類的有些屬性需要序列化,而其他屬性不需要被序列化舅锄,打個比方鞭达,如果一個用戶有一些敏感信息(如密碼,銀行卡號等)皇忿,為了安全起見畴蹭,不希望在網(wǎng)絡(luò)操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸鳍烁,這些信息對應(yīng)的變量就可以加上transient關(guān)鍵字叨襟。換句話說,這個字段的生命周期僅存于調(diào)用者的內(nèi)存中而不會寫到磁盤里持久化幔荒。
總之糊闽,java 的transient關(guān)鍵字為我們提供了便利,你只需要實現(xiàn)Serilizable接口爹梁,將不需要序列化的屬性前添加關(guān)鍵字transient右犹,序列化對象的時候,這個屬性就不會序列化到指定的目的地中卫键。
2. transient使用小結(jié)
1)一旦變量被transient修飾傀履,變量將不再是對象持久化的一部分虱朵,該變量內(nèi)容在序列化后無法獲得訪問莉炉。
2)transient關(guān)鍵字只能修飾變量,而不能修飾方法和類碴犬。注意絮宁,本地變量是不能被transient關(guān)鍵字修飾的。變量如果是用戶自定義類變量服协,則該類需要實現(xiàn)Serializable接口绍昂。
3)被transient關(guān)鍵字修飾的變量不再能被序列化,一個靜態(tài)變量不管是否被transient修飾偿荷,均不能被序列化窘游。
第三點可能有些人很迷惑,因為發(fā)現(xiàn)在User類中的username字段前加上static關(guān)鍵字后跳纳,程序運行結(jié)果依然不變忍饰,即static類型的username也讀出來為“Alexia”了,這不與第三點說的矛盾嗎寺庄?實際上是這樣的:第三點確實沒錯(一個靜態(tài)變量不管是否被transient修飾艾蓝,均不能被序列化)力崇,反序列化后類中static型變量username的值為當(dāng)前JVM中對應(yīng)static變量的值,這個值是JVM中的不是反序列化得出的
3. transient使用細(xì)節(jié)——被transient關(guān)鍵字修飾的變量真的不能被序列化嗎赢织?
我們知道在Java中亮靴,對象的序列化可以通過實現(xiàn)兩種接口來實現(xiàn),若實現(xiàn)的是Serializable接口于置,則所有的序列化將會自動進(jìn)行茧吊,若實現(xiàn)的是Externalizable接口,則沒有任何東西可以自動序列化俱两,需要在writeExternal方法中進(jìn)行手工指定所要序列化的變量饱狂,這與是否被transient修飾無關(guān)。