對象序列化機制:
對象序列化機制允許把內存中的Java對象轉換成平臺無關的二進制流,從而允許把這種二進制流持久地保存在磁盤上,或通過網絡將這種二進制流傳輸到另一個網絡節點。當其它程序獲取了這種二進制流,就可以恢復成原來的Java對象。
對象序列化的條件:
1、實現Serializable;
2、定義全局常量private static final long serialVersionUID;
3、除了當前Person類需要實現Serializable接口之外,還必須保證其內部所有屬性也都是可序列化的;(默認情況下,基本數據類型可序列化)
4、類中定義的用static和transient修飾的變量不能被序列化。
serialVersionUID的作用:
Java的序列化機制是通過在運行時判斷字節流中的 serialVersionUID與本地相應實體類的serialVersionUID來驗證該類版本的一致性的;
如果沒有顯示定義serialVersionUID,則程序會自動生成一個serialVersionUID,序列化後到反序列化前期間如果對類做了修改,那麼會導致本地相應的實體類的serialVersionUID發生變化,從而與字節流中的 serialVersionUID不相同;
在進行反序列化時,JVM會把傳來的字節流中的 serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認爲是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常。(InvalidCastException)
對象流:ObjectInputStream和OjbectOutputSteam
用於存儲和讀取基本數據類型數據或對象的處理流,它的強大之處就是可以把Java中的對象寫入到數據源中,也能把對象從數據源中還原回來。
- 序列化:用ObjectOutputStream類保存基本類型數據或對象的機制;
- 反序列化:用ObjectInputStream類讀取基本類型數據或對象的機制;
- ObjectOutputStream和ObjectInputStream同樣不能序列化static和transient修飾的成員變量。
例:
將下面的實體類用對象流實現序列化與反序列化:
class Person implements Serializable{
private static final long serialVersionUID = 1231242L;
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
//此處省略get/set方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
ObjectOutputStream測試類:
package cn.jingpengchong.io;
import java.io.*;
public class ObjectStreamTest {
public static void main(String[] args) {
testObjectOutputStream();
}
private static void testObjectOutputStream() {
ObjectOutputStream output = null;
try {
output = new ObjectOutputStream(new FileOutputStream("object.dat"));
output.writeObject(new Person("孫悟空",520,"男"));
//將緩存區的數據刷新到輸出流中
output.flush();
System.out.println("操作成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(output != null){
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
運行結果如下:
ObjectInputStream測試類:
package cn.jingpengchong.io;
import java.io.*;
public class ObjectStreamTest {
public static void main(String[] args) {
testObjectInputStream();
}
private static void testObjectInputStream() {
ObjectInputStream input = null;
try {
input = new ObjectInputStream(new FileInputStream("object.dat"));
Person per = (Person)input.readObject();
System.out.println(per);
} catch (Exception e){
e.printStackTrace();
} finally {
if(input != null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
運行結果如下: