天天看點

java序列化的實作

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本身就是線程安全的,傳輸過程中是不允許被并發通路的。是以對象能一個一個接連不斷的傳過來