Java對象流
ObjectInputStream和OjbectOutputSteam
用於存儲和讀取對象的處理流。它的強大之處就是可以把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
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 + "]";
}
}