1. 程式人生 > 其它 >什麼是 Java 序列化和反序列化,如何實現 Java 序列化

什麼是 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()方法讀取物件。