public interface Serializable類通過實現 java.io.Serializable 接口以啓用其序列化功能。未實現此接口的類將無法使其任何狀態序列化或反序列化。可序列化類的所有子類型本身都是可序列化的。序列化接口沒有方法或字段,僅用於標識可序列化的語義。
序列化就是將一個對象的狀態(各個屬性量)保存起來,然後在適當的時候再獲得。
序列化分爲兩大部分:序列化和反序列化。序列化是這個過程的第一部分,將數據分解成字節流,以便存儲在文件中或在網絡上傳輸。反序列化就是打開字節流並重構對象。對象序列化不僅要將基本數據類型轉換成字節表示,有時還要恢復數據。恢復數據要求有恢復數據的對象實例
序列化有什麼特點:
如果某個類能夠被序列化,其子類也可以被序列化。
聲明爲static和transient類型的成員數據不能被序列化。
static是類共享的,當該類一個對象被序列化後,這個static變量可能會被另一個對象改變,所以這決定了靜態變量是不能序列化的,但如果是final,就可以,因爲這是一個常量。
如果用transient聲明一個實例變量,當對象存儲時,它的值不需要維持。換句話來說就是,用transient關鍵字標記的成員變量不參與序列化過程。
什麼時候使用序列化:
對象序列化可以實現分佈式對象。主要應用例如:RMI要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。
java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入字節流中,可以保存在文件中或在網絡連接上傳遞。利用對象序列化可以進行對象的"深複製",即複製對象本身及引用的對象本身。序列化一個對象可能得到整個對象序列。
import java.io.Serializable;
/**
*
* @author InJavaWeTrust
*
*/
public class Person implements Serializable{
private static final long serialVersionUID = -399858645849256406L;
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
Java代碼 獲取【下載地址】
import java.io.File;
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;
/**
* 序列化與反序列化
* @author InJavaWeTrust
*
*/
public class TestPerson {
public static void main(String[] args) {
Person person = new Person();
person.setName("java");
person.setSex("F");
File file = new File("d:\\person.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
//序列化
OutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(person);
oos.flush();
oos.close();
os.close();
//反序列化
InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Person per = (Person) ois.readObject();
System.out.println("name[" + per.getName() + "]");
System.out.println("sex[" + per.getSex() + "]");
ois.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}