淺談java序列化
阿新 • • 發佈:2021-09-13
1、概念:
序列化:把物件轉換為位元組序列的過程
反序列化:把位元組序列轉化為物件的過程
2、程式碼:
public class Person implements Serializable{
// 指定序列化版本號
public static final long serialVersionUID = 112233445566778899L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
// 測public class SerializeTest { public static void main(String[] args) {
serializeObj();
deserializeObj();
}
/**
* 序列化
*/
public static void serializeObj() {
Person person = new Person();
person.setName("李白");
person.setAge(10);
try {
// 把物件序列化後的位元組存放到指定的檔案裡
File file = new File("E:/person.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(person);
System.out.println("序列化完成");
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 反序列化
*/
public static void deserializeObj() {
try {
File file = new File("E:/person.txt");
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Person person = (Person) objectInputStream.readObject();
System.out.println("反序列化完成");
System.out.println(person);
objectInputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
3、用處
伺服器端session的儲存、通訊時傳輸的資料等。
伺服器把session序列化後存到硬碟,以便節省記憶體,用到的時候在進行反序列化成Session物件。
通訊時資料傳輸的是序列化的位元組,接收引數時會進行反序列化成特定物件。
4、serialVersionUID
該欄位是序列化的版本號,實現了Serializable介面的類都有這個變數。
該欄位可顯示指定,也可不指定。當不指定時,編譯器會自動給這個class生成一個預設的版本號。
serialVersionUID 是序列化和反序列化之間的接頭暗號,只有這個暗號對得上反序列化才能成功!
如果實現 Serializable 介面的時候沒有指定serialVersionUID 也是沒什麼問題的,但會存在一種隱患:序列化後,將Person類進行了修改,哪怕是加個空格,反序列化也會失敗!
因為編譯器認為你的Person類結構變了,會重新生成一個serialVersionUID,反序列化的時候暗號對不上,無法反序列化。
所以,建議實現Serializable介面的時候指定serialVersionUID,避免反序列化時的相容性衝突。