目錄
前言
序列化對象,無非就是對對象的持久化存儲。
序列化常用存取類:序列化類(ObjectOutputStream),反序列化類(ObjectInputStream)。
標記接口:Serializble
要序列化的類必須實現該接口,該接口沒有任何方法和字段,僅用於標識可序列化的語句。
serialVersionUID版本號
下面是JDK1.6中文文檔的一段話:序列化時注意事項
序列化注意事項
也就是說:在反序列化過程用於驗證與目標類是否兼容。
比如:我對一個類進行序列化持久存儲,此時我對此類添加或刪除了某些屬性重新編譯,反序列化持久化對象時驗證UID版本號發現不等,拋出InvalidClassException異常。
爲什麼強烈建議我們顯示聲明serialVersionUID值?因爲在不同平臺中的JVM虛擬機算法計算的serialVersionUID值可能略有不同,所以在跨平臺的系統運行程序反序列化過程中可能拋出InvalidClassException異常。
序列化與反序化
先看常用構造
都是接收一個流
Test.java
package com.bin.demo;
import java.io.Serializable;
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public void setNmae(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "名字 = " + name + "、 年齡 = " + age;
}
}
main方法
//首先需要一個對象
Test t = new Test();
t.setNmae("超人");
t.setAge(2);
File file = new File("F:\\" + t.getClass().getSimpleName() + ".object"); //目的地
//序列化對象
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); //輸出流默認會創建目的並覆蓋
out.writeObject(t); //寫入對象
out.flush(); //刷新緩衝區
out.close();
//反序列化對象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
if (file.exists()) { //只有文件存在纔讀取
Test t2 = (Test) in.readObject(); //讀取對象並轉換類型
System.out.println(t2.toString()); //輸出內部數據
}
in.close();
輸出:
名字 = 超人、 年齡 = 2
瞬態關鍵字:transient
短暫瞬間的意思:只能在內存中的生命,而不是持久化。
使用此關鍵字修飾的變量將在序列化過程中不進行持久化存儲。同static靜態關鍵字,也是在序列化過程中不進行持久化存儲的。因爲static靜態的成員不可能出現在堆內存中,按照面向對象思想靜態是屬於類的,對象公有的。