Java內部類序列化
阿新 • • 發佈:2018-12-27
一個類能夠序列化,需要滿足兩個條件:
- 類本身實現序列化介面Serializable
- 類所有的成員屬性實現序列化介面Serializable
Java的巢狀類(nested class)一共有四種:
- static nested class 靜態巢狀類
- inner class 內部類(非靜態)
- local class 本地類(定義在方法內部)
- anonymous class 匿名類
靜態巢狀類的行為更接近普通的類,另外三個是真正的內部類。區別在於作用域的不同。
以下是對他們的性質描述:
1、首先我們對靜態巢狀類(static nested class)進行序列化。同理,也要實現序列化介面Serializable。
成功了,跟預料中一樣。
2、然後我們對內部類(inner class)進行序列化。同理,也要實現序列化介面Serializable。
異常了,提示我們外部類沒有序列化。那我們就將外部類也實現序列化介面。
成功了,這是為什麼呢?
網上查了一些資料,總結如下:
所有的內部類,Local內部類,匿名內部類都可以直接訪問外面的封裝類的例項變數和方法。而靜態巢狀類則不能。
為了實現這一行為,內部類,Local內部類,匿名內部類的例項都持有一個外部封裝類例項的隱式引用,而Java物件序列化要求物件裡所有的物件成員都必須實現序列化介面。
所以,巢狀類要想能夠序列化,除了本身和所有成員屬性都要實現序列化介面以外,要麼宣告為靜態巢狀類,要麼讓外部類也實現序列化介面。