IO的應用(二)--序列化與反序列化
阿新 • • 發佈:2018-11-01
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;
/**
-
- 物件序列化
-
把物件轉換為01二進位制序列就是物件序列化
-
一般會把01序列儲存到檔案中, 使用ObjectOutputStream類
-
- 物件反序列化
-
把01序列轉換為物件就是物件的反序列化
-
一般是從檔案中把01序列讀出來轉換為物件, 使用ObjectInputStream類
-
- 物件如果要進行序列化/反序列化, 物件的類必須實現Serializable介面
-
Serializable介面是一想 標誌介面,沒有任何方法,
-
- 一般情況下,類實現了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 + "]";
}
}