1. 程式人生 > >Java的序列化和反序列化,我所遇到的坑

Java的序列化和反序列化,我所遇到的坑

有時需要為物件做持久化,就是把記憶體裡的物件儲存到磁碟(暫且叫做磁碟吧,可以等同於sp、db、檔案、網路等)上,等以後需要這個物件的時候再從磁碟上還原到記憶體,因此需要序列化和反序列化。

如果使用ObjectOutputStream方式序列化,可能出現的坑如下:

坑1、類裡面一定要serialVersionUID,否則舊資料會反序列化會失敗

serialVersionUID是根據該類名、方法名等資料生產的一個整數,用來驗證版本是否一致。

如果不加這個欄位,當你的類修改了欄位,在反序列化的時候會直接報異常:InvalidCastException,導致無法完成反序列化。

舉個例子:類A沒有新增serialVersionUID,程式碼裡有序列化和反序列化邏輯,app匆匆發版了。然後某一天由於需求變動,在類A裡面增加了一個欄位變成了類AA,再次發版,當新使用者更新app後,使用反序列化以前的資料時,直接報異常。

坑2、一旦序列化儲存到磁碟操作後,就不要修改類名了,否則舊資料會反序列化會失敗。

舉個例子

所以儘量把物件轉換成JSON儲存更穩妥。