Serializable接口介紹
Serializable是java.io包中定義的、用於實現Java類的序列化操作而提供的一個語義級別的接口。Serializable序列化接口沒有任何方法或者字段,只是用於標識可序列化的語義。實現了Serializable接口的類可以被ObjectOutputStream轉換為字節流,同時也可以通過ObjectInputStream再將其解析為對象。例如,我們可以將序列化對象寫入文件后,再次從文件中讀取它並反序列化成對象。簡單說就是為了保存在內存中的各種對象的狀態,並且可以把保存的對象狀態再讀出來。
序列化是指把對象轉換為字節序列的過程,我們稱之為對象的序列化,就是把內存中的這些對象變成一連串的字節(bytes)描述的過程。
而反序列化則相反,就是把持久化的字節文件數據恢復為對象的過程。
serialVersionUID介紹
對於JVM來說,要進行持久化的類必須要有一個標記,只有持有這個標記JVM才允許類創建的對象可以通過其IO系統轉換為字節數據,從而實現持久化,而這個標記就是Serializable接口。而在反序列化的過程中則需要使用serialVersionUID來確定由那個類來加載這個對象,所以我們在實現Serializable接口的時候,一般還會去顯示地定義serialVersionUID。在反序列化的過程中,如果接收方為一個類的對象聲明,如果該對象的serialVersionUID與待反序列化的對象不同,那么反序列化的過程中將會導致InvalidClassException異常。
查看源碼
package java.io;
public interface Serializable {
}
測試代碼
Person類
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 8241970228716425282L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
}
測試類
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.setName("feige");
writeObj(p);
Person p2 = readObj();
System.out.println(p2);
}
// 序列化
public static void writeObj(Person p) {
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E://1.txt"));
objectOutputStream.writeObject(p);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 反序列化
public static Person readObj() {
Person p = null;
try {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E://1.txt"));
try {
p = (Person)objectInputStream.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return p;
}
}
控制台輸出:Person [name=feige]