使用Java的序列化和反序列化可以實現(xiàn)信息的持久存儲
要實現(xiàn)序列化必須實現(xiàn)java.io.Serializable這個接口。
如下,實現(xiàn)Serializable接口的javabean:
import java.io.Serializable;
public class A implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
進行序列化和反序列化操作類:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Test {
public static void main(String[] args) {
A a = new A();
a.setName("aaaaa");
serial(a);
System.out.println("=============");
deserial();
}
public static void serial(Serializable s) { // 序列化給定的類
try {
FileOutputStream fs = new FileOutputStream("test.txt");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(s);
os.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void deserial() { //反序列化給定的類
try {
FileInputStream fs = new FileInputStream("test.txt");
ObjectInputStream ois = new ObjectInputStream(fs);
A a = (A) ois.readObject();
System.out.println(a.getName());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
需要注意的幾個幾點:
(1)在每個要序列化的類中加入private static final 的serialVersionUID,這樣,即使在某個對象被序列化之后,它所對應的類被修改了,該對象也依然可以被正確地反序列化。
如果沒有加上private static final 的serialVersionUID,在調(diào)用serial(a);后在調(diào)用deserial();是正常顯示,現(xiàn)在直接調(diào)用deserial();就會報java.io.InvalidClassException異常。
(2)如果A類中有引用類型的實例變量,這個引用類型也要實現(xiàn)Serializable接口。否則就會報java.io.NotSerializableException異常。或者在不實例Serializable接口時,為這個引用變量加上transient關(guān)鍵字即可。但這樣引用類不會被存儲。