什麼是 Java 序列化和反序列化,如何實現 Java 序列化
一、概念
java物件序列化的意思就是將物件的狀態轉化成位元組流,以後可以通過這些值再生成相同狀態的物件。物件序列化是物件持久化的一種實現方法,它是將物件的屬性和方法轉化為一種序列化的形式用於儲存和傳輸。反序列化就是根據這些儲存的資訊重建物件的過程。
序列化:將java物件轉化為位元組序列的過程。
反序列化:將位元組序列轉化為java物件的過程。
二、為什麼要序列化和反序列化
我們知道,當兩個程序進行遠端通訊時,可以相互發送各種型別的資料,包括文字、圖片、音訊、視訊等,而這些資料都會以二進位制序列的形式在網路上傳送。那麼當兩個Java程序進行通訊時,能否實現程序間的物件傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話說,一方面,傳送方需要把這個Java物件轉換為位元組序列,然後在網路上傳送;另一方面,接收方需要從位元組序列中恢復出Java物件。當我們明晰了為什麼需要Java序列化和反序列化後,我們很自然地會想Java序列化的好處。其好處一是實現了資料的持久化,通過序列化可以把資料永久地儲存到硬碟上(通常存放在檔案裡),二是,利用序列化實現遠端通訊,即在網路上傳送物件的位元組序列。
三、JDK類庫中的序列化API
java.io.ObjectOutputStream代表物件輸出流,它的writeObject(Object obj)方法可對引數指定的obj物件進行序列化,把得到的位元組序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表物件輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個物件,並將其返回。
只有實現了Serializable和Externalizable介面的類的物件才能被序列化。Externalizable介面繼承自 Serializable介面,實現Externalizable介面的類完全由自身來控制序列化的行為,而僅實現Serializable介面的類可以 採用預設的序列化方式 。
物件序列化包括如下步驟:
1) 建立一個物件輸出流,它可以包裝一個其他型別的目標輸出流,如檔案輸出流;
2) 通過物件輸出流的writeObject()方法寫物件。
物件反序列化的步驟如下:
1) 建立一個物件輸入流,它可以包裝一個其他型別的源輸入流,如檔案輸入流;
2) 通過物件輸入流的readObject()方法讀取物件。