java對象流ObjectInputStream、ObjectOutputStream的使用

Java對象流

ObjectInputStreamOjbectOutputSteam
用於存儲和讀取對象的處理流。它的強大之處就是可以把Java中的對象寫入到數據源中,也能把對象從數據源中還原回來。

序列化(Serialize):用ObjectOutputStream類將一個Java對象寫入IO流中
反序列化(Deserialize):用ObjectInputStream類從IO流中恢復該Java對象


涉及下Java對象序列化機制:

對象序列化機制允許把內存中的Java對象轉換成平臺無關的二進制流,從而允許把這種二進制流持久地保存在磁盤上,或通過網絡將這種二進制流傳輸到另一個網絡節點。當其它程序獲取了這種二進制流,就可以恢復成原來的Java對象。

序列化的好處在於可將任何實現了Serializable接口的對象轉化爲字節數據,使其在保存和傳輸時可被還原。

序列化是 RMI(Remote Method Invoke – 遠程方法調用)過程的參數和返回值都必須實現的機制,而 RMI 是 JavaEE 的基礎。因此序列化機制是 JavaEE 平臺的基礎

如果需要讓某個對象支持序列化機制,則必須讓其類是可序列化的,爲了讓某個類是可序列化的,該類必須實現如下兩個接口之一:
Serializable
Externalizable(Serializable的子類)


要實現序列化類的條件:1、要求此類是可序列化的:實現Serializable接口即可


                                        2、要求此類中的屬性同樣是實現了Serializable接口的  注意:這兩個條件任意沒有實現的話,都會報java.io.NotSerializableException異常


3、提供一個版本號:private statis final long serialVersionUID
在這解析下使用這個版本號:
serialVersionUID用來表明類的不同版本間的兼容性
如果類沒有顯示定義這個靜態變量,它的值是Java運行時環境根據類的內部細節自動生成的。

若類的源代碼作了修改,serialVersionUID 可能發生變化。故建議,顯示聲明。


顯示定義serialVersionUID的用途:
希望類的不同版本對序列化兼容,不希望類的不同版本對序列化兼容,因此需確保類的不同版本具有相同的serialVersionUID
不希望類的不同版本對序列化兼容,因此需確保類的不同版本具有不同的serialVersionUID


4、使用static或transient修飾的屬性,不可實現序列化


Demo如下:

/**
 * 
 * @author KingDom
 * java對象流的使用:ObjectInputStream、ObjectOutputStream
 *
 */
public class TestObjectIOStream {
	//對象的序列號過程,將內存中的對象通過ObjectOutputStream轉換成二進制流,存儲在硬盤文件中
	@Test
	public void testObjectOutputStream(){
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(new FileOutputStream(new File("oos.txt")));
			Person person1 = new Person("KD", 21);
			Person person2 = new Person("KB", 31);
			oos.writeObject(person1);
			oos.flush();
			oos.writeObject(person2);
			oos.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(oos != null){
				try {
					oos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	//對象的反序列化過程:將硬盤中的文件通過ObjectInputStream轉換成相應的對象
	@Test
	public void testObjectInputStream(){
		ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(new FileInputStream(new File("oos.txt")));
			Person person1 = (Person)ois.readObject();
			System.out.println(person1);
			Person person2 = (Person)ois.readObject();
			System.out.println(person2);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{	
			try {
				ois.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

/*
 * 要實現序列化的類條件: 1、要求此類是可序列化的:實現Serializable接口
 * 				    2、要求類的屬性同樣的要實現Serializable接口		否則會報錯:java.io.NotSerializableException
 * 				    3、提供一個版本號:private statis final long serialVersionUID
 * 				    4、使用static或transient修飾的屬性,不可實現序列化
 */
class Person implements Serializable{

	private static final long serialVersionUID = 1L;
	private String name;
	private Integer age;
	
	public Person(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

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


運行結果:



發佈了25 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章