然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,誠然,你可以讓這個類來實作Externalizable接口,這個接口是Serilizable的子接口,但是你必須實作readExternal和writeExternal方法,你可以在這兩個方法中實作具體屬性的反序列化和序列化操作。然而這就意味着你必須在這兩個方法中手工編寫額外的代碼來進行具體屬性的序列化。java的transient關鍵字為我們提供了便利,你隻需要實作Serilizable接口,将不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
運作結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYGOxYTO3kTMxUTYyIGZzgjY2UTZzYTO0YTZlNDNhVDNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
在上面的例子中,我将屬性b前添加關鍵字transient,我們看到雖然我們序列化的對象a的屬性值為“張三”,但是當我們反序列化之後發現這個屬性為空,說明這個屬性沒有進行序列化。
transient使用小結
1)一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。
2)transient關鍵字隻能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是使用者自定義類變量,則該類需要實作Serializable接口。
3)被transient關鍵字修飾的變量不再能被序列化,一個靜态變量不管是否被transient修飾,均不能被序列化。
我們也可以,通過ArrayList 源碼中的 elementData 屬性,進一步學習transient這一屬性。
具體可以參照我的上一篇部落格。
以上。