序列化 / 反序列化
概述:序列化 (Serialization)是將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程。
- 在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以後,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
序列化:利用ObjectOutputStream,對象的信息,按固定格式轉成一串字節值輸出並持久保存到磁盤化。
- 反序列化:利用ObjectInputStream,讀取磁盤中序列化數據,重新恢復對象。
特點/應用場景:
- 需要序列化的文件必須實現Serializable接口以啓用其序列化功能。
- 不需要序列化的數據可以被修飾爲static的,由於static屬於類,不隨對象被序列化輸出。
- 不需要序列化的數據也可以被修飾爲transient臨時的,只在程序運行期間,在內存中存在不會被序列化持久保存。
- 在反序列化時,如果和序列化的版本號不一致時,無法完成反序列化。
- 每個被序列化的文件都有一個唯一id,如果沒有添加編譯器會根據類的定義信息計算產生一個版本號。
- 常用於服務器之間的數據傳輸,序列化成文件,反序列化讀取數據。
- 常用於使用套接字流在主機之間傳遞對象。
ObjectOutputStream
ObjectOutputStream
- 將 Java 對象的基本數據類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。
> -- ObjectOutputStream(OutputStream out)
創建寫入指定 OutputStream 的 ObjectOutputStream。
> -- void writeObject(Object obj)
將指定的對象寫入 ObjectOutputStream。
ObjectInputStream
ObjectInputStream
- 對以前使用 ObjectOutputStream 寫入的基本數據和對象進行反序列化。
> -- ObjectInputStream(InputStream in)
創建從指定 InputStream 讀取的 ObjectInputStream。
> -- Object readObject()
從 ObjectInputStream 讀取對象,讀取序列化數據。
將學生信息序列化至磁盤【序列化】
public class Seri {
public static void main(String[] args) throws Exception, IOException {
//序列化:就是把java對象保存在磁盤中
ObjectOutputStream os =
new ObjectOutputStream(
new FileOutputStream( "D:\\teach\\a\\student.txt"));
Student s = new Student("張三",20,"成都");
os.writeObject(s);
os.close();//關閉輸出資源
//反序列化:從磁盤讀到程序裏
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream(
"D:\\teach\\a\\student.txt"));
//讀到的對象,默認是Object,需要強轉成子類
Student s2 = (Student)in.readObject();
System.out.println(s2);
}
}
//1,如果想完成序列化,類必須實現Serializable接口
//只是用來做標記,需要序列化
class Student implements Serializable{
//創建對象用
public Student(String name, int age, String addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
//一般序列化的都是屬性
String name = "張三";
int age = 20;
String addr = "成都";
//爲了看屬性值
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}