1. 程式人生 > >IO的應用(二)--序列化與反序列化

IO的應用(二)--序列化與反序列化

package com.bjpowernode.demo02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;

/**

    1. 物件序列化
  •  把物件轉換為01二進位制序列就是物件序列化
    
  •  一般會把01序列儲存到檔案中, 使用ObjectOutputStream類
    
    1. 物件反序列化
  •  把01序列轉換為物件就是物件的反序列化
    
  •  一般是從檔案中把01序列讀出來轉換為物件, 使用ObjectInputStream類
    
    1. 物件如果要進行序列化/反序列化, 物件的類必須實現Serializable介面
  •  Serializable介面是一想 標誌介面,沒有任何方法, 
    
    1. 一般情況下,類實現了Serializable介面後,會手動的新增serialVersionUID欄位, 防止反序列化出現異常
  •  private static final long serialVersionUID = -564123146743165710L;
    

*/
public class Test04 {

public static void main(String[] args) throws IOException, ClassNotFoundException {
	Person p1 = new Person("lisi", 18);
	//物件序列化,簡單的可以理解為把物件儲存到檔案中

// saveObject( p1 );

	Object obj = readObject();
	System.out.println( obj );
	/*
	 * 把物件儲存到檔案之後  ,又修改了類的結構, 再進行反序列化時, 就會出現異常 java.io.InvalidClassException:
	 * 	 com.bjpowernode.demo02.Person; local class incompatible: 
	 * 	stream classdesc serialVersionUID = -3136557166480575792, 
	 * 	local class serialVersionUID = 198229193265816609
	 * 分析:
	 * 		類實現了Serializable介面後,系統會自動生成一個欄位serialVersionUID
	 * 		當在類中添加了欄位,修改了類的結構,  再次編譯後,會生成一個新的serialVersionUID的欄位值
	 * 		再進行反序列化時, 兩個serialVersionUID欄位值不相同, 就會產生異常
	 * 解決方法:
	 * 		保證在序列化和反序列化時, serialVersionUID欄位的值一樣即可
	 * 		可以手動的新增serialVersionUID欄位
	 */
}

// 物件反序列化, 簡單的理解為就是從檔案中把物件讀取出來
private static Object readObject() throws IOException, ClassNotFoundException {
	InputStream in = new FileInputStream("d:/obj.txt");
	ObjectInputStream ois = new ObjectInputStream(in);
	Object obj = ois.readObject();
	ois.close();
	return obj;
	
	/*try {
		return ois.readObject();
	} finally {
		ois.close();
	}*/
}

//物件序列化
private static void saveObject(Object obj) throws IOException {
	OutputStream out = new FileOutputStream("d:/obj.txt");
	ObjectOutputStream oos = new ObjectOutputStream(out);
	oos.writeObject(obj);
	oos.close();
}

}
//一般情況下,類實現了Serializable介面後,會手動的新增serialVersionUID欄位
class Person implements Serializable{
String name;
int age;
String gender = “男”;

//手動的定義一個序列化版本號
private static final long serialVersionUID = -564123146743165710L;


public Person(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}


@Override
public String toString() {
	return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}

}