1. 程式人生 > >Java內部類序列化

Java內部類序列化

一個類能夠序列化,需要滿足兩個條件:

  1. ​​​​​​​類本身實現序列化介面Serializable
  2. 類所有的成員屬性實現序列化介面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物件序列化要求物件裡所有的物件成員都必須實現序列化介面。

所以,巢狀類要想能夠序列化,除了本身和所有成員屬性都要實現序列化介面以外,要麼宣告為靜態巢狀類,要麼讓外部類也實現序列化介面。