1. 程式人生 > 實用技巧 >匿名類無法序列化

匿名類無法序列化

場景:需要序列化的類實現了Serializable介面,但在建立物件的時候序列化失敗了,丟擲異常:java.io.NotSerializableException

結果發現建立物件的方式是以匿名類建立的:

Pagination  pagination =
                new Pagination() {{
                    setPage(pageNo);
                    setPageSize(pageSize);
                }};

但是正常的set複製則不會丟擲序列化失敗的錯誤。

原因:

產生這個問題的核心在於java雙括號用法的機制

第一層括號定義一個內部匿名類第二層括號時一個設立初始化塊。

因為雙括號的在產生的時內部匿名類物件,在執行序列化時會執行構造匿名物件,那麼會存在一個拆箱轉化的過程,正常來說不應該有問題,賦值,然後序列化。

但是匿名內部類的物件會伴隨主物件的整個生命週期,並且匿名類必然不會繼承序列化介面支援序列化,所以在執行序列化時會發生無法序列化外部類的情況,因為匿名類物件也是一個需要序列化的成員。