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序列化(也就是把這兩個對象轉爲二進制,理解爲“打碎”)
package com.ohc.oos;
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();
}
}