java 串行化技術可以使你将一個對象的狀态寫入一個byte 流裡,并且可以從其它地方把該byte 流裡的資料讀出來,重新構造一個相同的對象。這種機制允許你将對象通過網絡進行傳播,并可以随時把對象持久化到資料庫、檔案等系統裡。java的串行化機制是rmi、ejb等技術的技術基礎。用途:利用對象的串行化實作儲存應用程式的目前工作狀态,下次再啟動的時候将自動地恢複到上次執行的狀态。
序列化就是一種用來處理對象流的機制,所謂對象流也就是将對象的内容進行流化。可以對流化後的對象進行讀寫操作,也可将流化後的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實作:将需要被序列化的類實作serializable接口,然後使用一個輸出流(如:fileoutputstream)來構造一個objectoutputstream(對象流)對象,接着,使用objectoutputstream對象的writeobject(object obj)方法就可以将參數為obj的對象寫出(即儲存其狀态),要恢複的話則用輸入流。
2、串行化的特點:
(1)如果某個類能夠被串行化,其子類也可以被串行化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實作了可串行化接口。則其父類的相應字段及屬性的處理和該類相同;如果該類的父類沒有實作可串行化接口,則該類的父類所有的字段屬性将不會串行化。
(2)聲明為static和transient類型的成員資料不能被串行化。因為static代表類的狀态,transient代表對象的臨時資料;
(3)相關的類和接口:在java.io包中提供的涉及對象的串行化的類與接口有objectoutput接口、objectoutputstream類、objectinput接口、objectinputstream類。
(1)objectoutput接口:它繼承dataoutput接口并且支援對象的串行化,其内的writeobject()方法實作存儲一個對象。objectinput接口:它繼承datainput接口并且支援對象的串行化,其内的readobject()方法實作讀取一個對象。
(2)objectoutputstream類:它繼承outputstream類并且實作objectoutput接口。利用該類來實作将對象存儲(調用objectoutput接口中的writeobject()方法)。objectinputstream類:它繼承inputstream類并且實作objectinput接口。利用該類來實作讀取一個對象(調用objectinput接口中的readobject()方法)。
對于父類的處理,如果父類沒有實作串行化接口,則其必須有預設的構造函數(即沒有參數的構造函數)。否則編譯的時候就會報錯。在反串行化的時候,預設構造函數會被調用。但是若把父類标記為可以串行化,則在反串行化的時候,其預設構造函數不會被調用。這是為什麼呢?這是因為java 對串行化的對象進行反串行化的時候,直接從流裡擷取其對象資料來生成一個對象執行個體,而不是通過其構造函數來完成。
import java.io.*;
public class cat implements serializable {
private string name;
public cat () {
this.name = "new cat";
}
public string getname() {
return this.name;
public void setname(string name) {
this.name = name;
public static void main(string[] args) {
cat cat = new cat();
try {
fileoutputstream fos = new fileoutputstream("catdemo.out");
objectoutputstream oos = new objectoutputstream(fos);
system.out.println(" 1> " + cat.getname());
cat.setname("my cat");
oos.writeobject(cat);
oos.close();
} catch (exception ex) {ex.printstacktrace();}
fileinputstream fis = new fileinputstream("catdemo.out");
objectinputstream ois = new objectinputstream(fis);
cat = (cat) ois.readobject();
system.out.println(" 2> " + cat.getname());
ois.close();
} catch (exception ex) {
ex.printstacktrace();
}//writeobject和readobject本身就是線程安全的,傳輸過程中是不允許被并發通路的。是以對象能一個一個接連不斷的傳過來