對程序員來講,Serializable 接口 一直隱藏在我們的代碼中,但序列化操作已經封裝在我們所使用的框架中,所以序列化已經無需我們親自實現Serializable接口。但是每次深入瞭解別人的代碼或現使用的框架,對他們使用了Serializable總是特別迷惑。下面我將已程序媛的角度對Serializable接口進行講解:
1.對序列化做簡單的定義。 Serializable接口 在jdk中 定義爲 java.io.Serializable,此接口沒有方法、沒有屬性,僅僅用於標識可序列化。簡單來說就是將對象示例保存到文件、數據庫,進行傳輸。需要用時讀磁盤或數據庫將數據還原。
2.我們平時在什麼場景下用到了序列化。其實我們平時就有用到很多序列化,只是我們不知道它就是序列化而已。目前我所瞭解到的序列化方式有:二進制、xml、json。其中二進制傳輸比如圖片、peson實例等,通過outputStream、inputStream進行寫入和讀入。
3. 關於private static final long serialVersionUID = 7835683779754L。大家對這語句已經太熟悉了。首先講講jdk中序列化的原理。比如下面:
舊對象 :public class Person implements Serializable (){ private String name;} 新對象:public class Person implements Serializable(){ private String name1;}. 改變了裏面的屬性名。當對象實現 Serializable時,對象已經默認產生了一個serialVersionUID。當你改變屬性名時,系統又會重新生成一個serialVersionUID。所以當舊對象要反序列爲新對象時,因爲SUID不同就會出現報錯:java.io.InvalidClassException:Employee; local class incompatible。很多時候爲了避免因爲新對象屬性的增加,我們常常自定義一個serialVersionUID。兼容舊對象的讀取,改變或新增的屬性名默認爲fasle、0、null。
4.總結。很多時候我們進行的數據傳輸、保存文件都是使用或間接使用了序列化的接口。