關於java關鍵字transient

查看ArrayList和LinkedList源代碼,裏面有一個關鍵字transient。

以前不知道transient是什麼意思,現在特意補充下知識的盲點。

1.transient的作用和使用方法

當一個對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式爲開發者提供了很多便利,我們可以不必關心具體序列化的過程,只要這個類實現了Serilizable接口,這個類的所有屬性和方法都會自動序列化。

然而在在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要序列化,打個比方,如果一個用戶有一些敏感信息(如密碼、銀行卡號等),爲了安全起見,不希望在網絡操作(主要涉及到序列化操作,本地序列化緩存也使用)中被傳輸,這些信息對應的變量就可以加上transient關鍵字。換句話說,這個字段的生命週期僅存於調用者的內存中而不會寫到磁盤裏持久化。

總之,java的transient關鍵字爲我們提供便利,你只需要實現Serilizable接口,將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會列到指定的目的地中。

2.transient使用小結

1).一旦變量被transient修飾,變量不再是對象持久化的一部分,該變量內容在序列化後無法獲得訪問。

2).transient關鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是用戶自定義變量,則該類需要實現Serilizable接口。

3).被transient關鍵字修飾的變量不再被序列化,一個靜態變量不管是否被transient修飾,均不能不序列化。

反序列化後類中static型變量值爲當前JVM中對應static變量的值,這個值是JVM中不是反序列化得出的,

3.transient使用細節--被transient關鍵字修飾的變量真的不能被序列化嗎?

我們知道在java中,對象的序列化可以通過實現兩種接口來實現,若實現的是Serilizable接口,則所有的序列化將會自動進行,若實現的Externalizable接口,則沒有任何東西可以自動序列化,需要在writeExternal方法中進行手工指定所要序列化的變量,這與是否被transient修飾無關,因此第二個例子輸出的是變量content初始化的內容,而不是null。


發佈了40 篇原創文章 · 獲贊 59 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章