1. 程式人生 > >詳細介紹Serializable的使用和注意事項

詳細介紹Serializable的使用和注意事項

引言

開啟Serializable

Serializable是Java提供的一套標準的序列化介面,是一個空介面,為物件提供序列化和反序列化操作.使用也是相當的簡單,只要實現介面即可.

使用Serializable實現序列化非常簡單,然後進行序列化和反序列化也非常簡單,ObjectOutputStream和ObjectInputStream即可.

建立User類實現Serializable介面然後:

序列化和反序列化

注意事項

注意一 : 用不用指定serialVersionUID

首先serialVersionUID是系統為我們提供輔助我們進行序列化和反序列化過程的,序列化的時候系統會把當前類的serialVersionUID寫入序列化的檔案中(也可能其他中介),然後反序列化的時候會檢查serialVersionUID是否和當前類的serialVersionUID一致,如果一致才進行反序列化,否則失敗,會報如下錯誤

反序列化失敗

如果我們不手動指定serialVersionUID的值,系統會自動生成當前類的hash值然後賦值給serialVersionUID,那麼如果當前類的欄位有變動比如:增加或刪除,那麼系統會重新計算hash值,那麼在反序列化的時候就會失敗.

所以我們可以手動指定serialVersionUID的值,這樣在app升級之後,如果有新增或修改類的欄位,同樣可以反序列化成功,最大程度的恢復資料.

但是有一種情況需要注意:如果當前類結構發生了非常規性改變(修改類名,修改欄位型別……),那麼即使指定了serialVersionUID也不可能反序列化成功,因為不可能從一個老版本的類轉變為一個新的類

使用AndroidStudio自動生成serialVersionUID

單擊選單欄 File -> Setting -> Editor -> Inspections -> Serialization issues ->Serializable class without ‘serialVersionUID’ 打上勾即可

設定自動生成UID

然後我們就可以在類名上 alt+enter 選擇生成UID即可

自動生成UID

新增UID

注意二 : 如何讓部分欄位不參與序列化

1 . 靜態變數屬於類,不屬於物件,所以不參加物件的序列化
2 .使用transient修飾的變數不參與序列化

注意三 : 重寫序列化和反序列化過程

一般情況下根本不需要重寫這兩個過程,但是可以重寫
只需要重寫writeObject和readObject兩個方法即可

希望這篇文章可以幫助到需要的人,如果還有其他問題或者補充可以聯絡我~~~