1. transient的作用
實體類實現了Serilizable接口,就可以被自動序列化,然後有些特殊字段如密碼,金錢等不想被序列化就可以使用transient關鍵詞來解決。
transient修飾的是變量,不能修飾方法和類。靜態變量不能被序列化,不能被序列化的意思的序列化進去和反序列化出來的值可能不是你想要的,而是jvm中當前的值。
具體的demo可以參考上面鏈接裏的例子,被transient修飾的字段不是不序列化了,只是反序列化回來後得到的是null。
View Code
輸出結果:
read after Serializable:
id: 0 //如果修飾的是int類型,反序列化回來是0
username: abc
password: null //如果修飾的是string類型,反序列化回來是null
test.txt文件裏內容://被修飾的id和password不會被序列化到文件裏
sr test.ClassInfo L namet Ljava/lang/String;xpt abc
//加入Java開發交流君樣:756584822一起吹水聊天
應用場景:當一個實體類字段太多,要序列化出去,比如給ajax接口或者其他接口使用,有些信息不想被參與序列化,可以使用transient來解決。
注意事項
- 1)一旦變量被transient修飾,變量將不再是對象持久化的一部分,該變量內容在序列化後無法獲得訪問。
- 2)transient關鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是用戶自定義類變量,則該類需要實現Serializable接口。
- 3)被transient關鍵字修飾的變量不再能被序列化,一個靜態變量不管是否被transient修飾,均不能被序列化。
第三點可能有些人很迷惑,因爲發現在User類中的username字段前加上static關鍵字後,程序運行結果依然不變,即static類型的username也讀出來爲“Alexia”了,這不與第三點說的矛盾嗎?實際上是這樣的:第三點確實沒錯(一個靜態變量不管是否被transient修飾,均不能被序列化),反序列化後類中static型變量username的值爲當前JVM中對應static變量的值,這個值是JVM中的不是反序列化得出的。
3. 如果是Externalizable實現的序列化
對象的序列化可以通過實現兩種接口來實現,若實現的是Serializable接口,則所有的序列化將會自動進行,若實現的是Externalizable接口,則沒有任何東西可以自動序列化,需要在writeExternal方法中進行手工指定所要序列化的變量,這與是否被transient修飾無關。