1. 程式人生 > >序列化內部類時的注意事項

序列化內部類時的注意事項

  java物件傳輸很多需要先將物件序列化,當對內部類進行序列化的時候,程式執行會報異常:不能將沒有實現序列化介面的Object序列化。

  怎麼回事,這是一個很簡單的內部類,的確已經實現了序列化介面了,其定義的成員都是可序列化的String型別;將其換成普通類沒有問題。難道不能使用序列化的內部類?

  其實我們使用的內部類是巢狀類(nested class)的一種,而nested class 共有四種:

static nested class 靜態巢狀類 
inner class 內部類(非靜態) 
local class 本地類(定義在方法內部) 
anonymous class 匿名類 


  靜態巢狀類的行為更接近普通的類,另外三個是真正的內部類。區別在於作用域的不同。

  以下是對他們的性質描述: 
這裡寫圖片描述

  所有的內部類,Local內部類,匿名內部類都可以直接訪問外面的封裝類的例項變數和方法。而靜態巢狀類則不能。

  除錯程式碼可以發現,內部類,Local內部類,匿名內部類的例項都持有一個外部封裝類例項的隱式引用,而java物件序列化要求物件裡所有的物件成員都實現序列化介面。

  所以,如果只有內部類實現序列化,而外部封裝類沒有實現序列化介面,就會在對內部類進行序列化的時候報出異常