匿名類無法序列化
阿新 • • 發佈:2020-09-16
場景:需要序列化的類實現了Serializable介面,但在建立物件的時候序列化失敗了,丟擲異常:java.io.NotSerializableException
結果發現建立物件的方式是以匿名類建立的:
Pagination pagination = new Pagination() {{ setPage(pageNo); setPageSize(pageSize); }};
但是正常的set複製則不會丟擲序列化失敗的錯誤。
原因:
產生這個問題的核心在於java雙括號用法的機制
第一層括號定義一個內部匿名類,第二層括號時一個設立初始化塊。
因為雙括號的在產生的時內部匿名類物件,在執行序列化時會執行構造匿名物件,那麼會存在一個拆箱轉化的過程,正常來說不應該有問題,賦值,然後序列化。
但是匿名內部類的物件會伴隨主物件的整個生命週期,並且匿名類必然不會繼承序列化介面支援序列化,所以在執行序列化時會發生無法序列化外部類的情況,因為匿名類物件也是一個需要序列化的成員。