淺析Java中的序列化和反序列化

1、  Java序列化:是指將對象轉換爲字節序列的過程;

  反序列化:是指將字節序列轉換成目標對象的過程。

2、要序列化一個對象,其所屬的類必須實現以下兩種接口之一:

  • java.io.Serializable
  • java.io.Externalizable

3、爲什麼要序列化呢?

  主要是爲了長久保存一個對象的狀態並在需要時獲取該對象的信息以重新構造一個狀態完全相同的對象。

在進行瀏覽器訪問的時候,我們看到的文本、圖片、音頻、視頻等都是通過二進制序列進行傳輸的,那麼如果我們需要將Java對象進行傳輸的時候,也要將對象進行序列化。首先需要先將Java序列化,然後通過網絡,IO進行傳輸,當到達目的地之後,在進行反序列化獲取我麼想要的對象,最後完成通信。

  通過寫出對象的狀態數據來記錄一個對象。

4、實現序列化要使用到JDK中的關鍵類 ObjectOutputStream和ObjectInputStream

  ObjectOutputStream類中,通過使用writeObject(Object object)方法,將對象以二進制格式進行寫入。

  ObjectInputStream類中,通過使用readObject()方法,從輸入流中讀取二進制流,轉換成對象。

5、首先定義一個emp類 必須實現serializable接口才可以被序列化

Serializable 接口的作用只是用來標識我們這個類是需要進行序列化,並且Serializable 接口中並沒有提供任何方法。

transient關鍵字是爲了聲明個別不希望被序列化的非static屬性,比如不將對象中的密碼等信息序列化,以增強安全性。

public class Emp implements Serializable{

	public static int tall=1000;
	private String name;
	private int age;
	private int sex;
	private transient int pass;
	
	
	public static int getTall() {
		return tall;
	}
	public static void setTall(int tall) {
		Emp.tall = tall;
	}
	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;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	public int getPass() {
		return pass;
	}
	public void setPass(int pass) {
		this.pass = pass;
	}
	public Emp() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Emp(String name, int age, int sex, int pass) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.pass = pass;
	}
	@Override
	public String toString() {
		return "Emp [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
	

6、在對象序列化過程中,其所屬類的static屬性和方法代碼不會被序列化處理。

因爲static屬性有整個類所有的對象共享,不應該因爲一個對象的寫出和恢復就將整個對象共有的這個static屬性覆蓋。比如在當前運行中,static屬性在不斷被修改,不能因爲突然恢復了一個對象,就把static屬性也恢復到該對象當初寫出時的狀態。

7、序列化對象

public static void main(String[] args) throws IOException {
		FileOutputStream out = new FileOutputStream("F:\\e.ee");
		ObjectOutputStream oos = new ObjectOutputStream(out);
		oos.writeObject(new Emp("lisi",30,1,001));
		oos.close();
		out.close();
	}

8、反序列化

public static void main(String[] args) throws IOException, ClassNotFoundException {
		FileInputStream in = new FileInputStream("F:\\e.ee");
		ObjectInputStream ois = new ObjectInputStream(in);
		
		Emp emp = (Emp)ois.readObject();
		System.out.println(emp);
		
		ois.close();
		in.close();
	}
Java中對象的序列化和反序列化還有很多種存入和讀取的方法,此處只列舉了一種,有意向的盆友可以去查查看哈~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章