【Java】序列化對象基礎——核心細節

目錄

前言

標記接口:Serializble

serialVersionUID版本號

 序列化注意事項

序列化與反序化

瞬態關鍵字:transient


前言

序列化對象,無非就是對對象的持久化存儲。

序列化常用存取類:序列化類(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靜態的成員不可能出現在堆內存中,按照面向對象思想靜態是屬於類的,對象公有的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章