【18期】Java序列化與反序列化三連問:是什麼?為什麼要?如何做?
Java序列化與反序列化是什麼?
Java序列化是指把Java物件轉換為位元組序列的過程,而Java反序列化是指把位元組序列恢復為Java物件的過程:
-
序列化:物件序列化的最主要的用處就是在傳遞和儲存物件的時候,保證物件的完整性和可傳遞性。序列化是把物件轉換成有序位元組流,以便在網路上傳輸或者儲存在本地檔案中。核心作用是物件狀態的儲存與重建。
-
反序列化:客戶端從檔案中或網路上獲得序列化後的物件位元組流,根據位元組流中所儲存的物件狀態及描述資訊,通過反序列化重建物件。
為什麼需要序列化與反序列化?
為什麼要序列化,那就是說一下序列化的好處嘍,序列化有什麼什麼優點,所以我們要序列化。
物件序列化可以實現分散式物件
主要應用例如:RMI(即遠端呼叫Remote Method Invocation)要利用物件序列化執行遠端主機上的服務,就像在本地機上執行物件時一樣。
java物件序列化不僅保留一個物件的資料,而且遞迴儲存物件引用的每個物件的資料
可以將整個物件層次寫入位元組流中,可以儲存在檔案中或在網路連線上傳遞。利用物件序列化可以進行物件的"深複製",即複製物件本身及引用的物件本身。序列化一個物件可能得到整個物件序列。
序列化可以將記憶體中的類寫入檔案或資料庫中
比如:將某個類序列化後存為檔案,下次讀取時只需將檔案中的資料反序列化就可以將原先的類還原到記憶體中。也可以將類序列化為流資料進行傳輸。
總的來說就是將一個已經例項化的類轉成檔案儲存,下次需要例項化的時候只要反序列化即可將類例項化到記憶體中並保留序列化時類中的所有變數和狀態。
物件、檔案、資料,有許多不同的格式,很難統一傳輸和儲存
序列化以後就都是位元組流了,無論原來是什麼東西,都能變成一樣的東西,就可以進行通用的格式傳輸或儲存,傳輸結束以後,要再次使用,就進行反序列化還原,這樣物件還是物件,檔案還是檔案。
如何實現Java序列化與反序列化
首先我們要把準備要序列化類,實現 Serializabel介面
例如:我們要Person類裡的name和age都序列化
import java.io.Serializable; public class Person implements Serializable { //本類可以序列化 private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "姓名:" + this.name + ",年齡" + this.age; } }
然後:我們將name和age序列化(也就是把這2個物件轉為二進位制,理解為“打碎”)
import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo { //序列化 public static void main(String[] args) throws Exception { //序列化後生成指定檔案路徑 File file = new File("D:" + File.separator + "person.ser"); ObjectOutputStream oos = null; //裝飾流(流) oos = new ObjectOutputStream(new FileOutputStream(file)); //例項化類 Person per = new Person("張三", 30); oos.writeObject(per); //把類物件序列化 oos.close(); } }