transient
1、 transient的釋義
在百度百科里對transient的解釋是:
java語言的關鍵字,變量修飾符,如果用transient聲明一個實例變量,當對象存儲時,它的值不需要維持。換句話來說就是,用transient關鍵字標記的成員變量不參與序列化過程。
作用:
Java的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,我們不想用serialization機制來保存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。當一個對象被序列化的時候,transient型變量的值不包括在序列化的表示中,然而非transient型的變量是被包括進去的。
但是在我看到這么多專有名詞的時候腦袋還是有點暈的,后來研究了一下,是這么個意思:
在緩存機制中、IO(讀寫文件)、網絡傳輸的過程中,我們對一些文件、字符、圖像的傳輸是沒有辦法整體傳輸的,那么我們這個時候會將這些對象轉換成字節進行數據的傳輸,這個過程就是序列化的過程。但是,打個比方我們在進行信息傳遞的過程中有一些敏感信息例如密碼是不能夠進行傳輸的,這時候我們就需要在密碼屬性前面添加transient關鍵字,使密碼屬性跳出對象序列化的范圍中,所以在一定程度上保證了該信息的安全。
ps:序列化百度解釋:
序列化 (Serialization)將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
2、 transient的實際使用
a、 序列化的基本展示實現Serializable接口
二話不說直接上例子吧:
輸出結果為:
transient.txt文件中內容為:
從輸出結果來看我們很清楚的可以看到,添加了transient關鍵字后pwd參數無法保存到txt文件中。
Ps:
如果Test1類中的參數添加了static關鍵字修飾,那么在讀取寫入的文件之前修改了相關的參數,那么在反序列化過程中該參數不會被改變,會保留你修改后的結果,因為static參數是隨着類加載的過程中一起保存在java虛擬機內存中的,而在反序列化過程中並不會修改這些靜態變量。
b、 序列化的另一種實現Externalizable接口
二話再次不多說直接看代碼吧
輸出結果為:
輸出的文件為:
結果很明顯實現Externalizable接口實現了兩個函數分別是writeExternal和readExternal。
這樣子在序列化的過程中只序列化了name和age兩個參數。
Ps:
1、 如果pwd存在默認值得話輸出結果就不會為null,會得到重新初始化,值為初始參數
2、 ReadExternal函數接口調用的過程中會調用相應參數的get方法,必須要添加進去
3、 transient的意外
是否只要添加了transient關鍵字就一定會在序列化過程中不被序列化?
答案是否定的,請看如下代碼。
輸出結果為:
輸出文件為:
看到如圖代碼和輸出結果,我們可以清楚的看到哪怕pwd參數添加了transient關鍵字,但是因為實現的是Externalizable接口,所以在重寫的writeExternal和readExternal函數中只要添加了pwd參數的寫入和讀取,transient關鍵字就相當於是失效的。
希望對大家有所幫助,代碼依然是圖片,手敲有益身心健康。
參考博客:
https://www.cnblogs.com/lanxuezaipiao/p/3369962.html