Java中對象序列化技術

 
1、含義:將一個對象的狀態(各個屬性量)保存起來,然後在適當的時候再獲得。
2、編程要求:只有實現Serializable接口的類對象纔可以被序列化。 Serializable接口沒有定義任何成員,它只用來說明某個類可以被序列化。
3、序列化的特點:
(1)如果某個類能夠被序列化,其子類也可以被序列化。
(2)聲明爲static和transient類型的成員數據不能被序列化。因爲static代表類的狀態, transient代表對象的臨時數據。
(3)相關的類和接口:在java.io包中提供如下涉及對象的序列化的類與接口:ObjectOutput接口、ObjectOutputStream類、ObjectInput接口、ObjectInputStream類。
4、ObjectOutput接口和ObjectOutputStream類
(1)ObjectOutput接口:它繼承DataOutput接口並且支持對象的序列化,其內的writeObject()方法實現存儲一個對象。
(2)ObjectOutputStream類:它繼承OutputStream類並且實現ObjectOutput接口。利用該類來實現將對象存儲(調用ObjectOutput接口中的writeObject()方法)。
注意:
(1)也可以利用ObjectOutputStream類的對象寫入其它基本類型的數據值。
(2)出錯時將拋出IOException異常。
5、ObjectInput接口和ObjectInputStream類
(1)ObjectInput接口:它繼承DataInput接口並且支持對象的序列化,其內的readObject()方法實現讀取一個對象。
(2)ObjectInputStream類:它繼承InputStream類並且實現ObjectInput接口。利用該類來實現將對象存儲(調用ObjectInput接口中的readObject()方法)。
注意:
(1)也可以利用ObjectInputStream類的對象讀取其它基本類型的數據值。
(2)出錯時將拋出IOException異常。
6、對象的序列化用途:利用對象的序列化實現保存應用程序的當前工作狀態,下次再啓動的時候將自動地恢復到上次執行的狀態。下面給出讀寫對象狀態的源程序片段:
 (1)讀取對象的狀態
FrameConfig configData=null; //FrameConfig類中包含有要保存的數據
      currentDir=System.getProperty("user.dir");
 try {
      FileInputStream fim=new FileInputStream("config.dat");
ObjectInputStream oim=new ObjectInputStream(fim);
      configData=(FrameConfig)oim.readObject();
fim.close();
oim.close();
if(configData!=null) { //獲得對象中的數據並保存在程序的變量中
currentDir=configData.currentDir;
WindowStyle=configData.WindowStyle;
topX=configData.topX;
topY=configData.topY;
windowWidth=configData.windowWidth;
      windowHeight=configData.windowHeight; }
else { //如果未能夠正確地讀出數據將採用缺省值
topX=0;
topY=0;
windowWidth=Toolkit.getDefaultToolkit().getScreenSize ().width;
windowHeight=Toolkit.getDefaultToolkit().getScreenSize().height-25; } }
      catch(IOException e) { } catch(ClassNotFoundException e) { }
(2)保存對象的狀態
FileOutputStream fom=null;
ObjectOutputStream oom=null; //FrameConfig類中包含有要保存的數據
 FrameConfig configData=new FrameConfig(this);
 try {
fom=new FileOutputStream("config.dat");
      oom=new ObjectOutputStream(fom);
oom.writeObject(configData);
      oom.flush();
      fom.close();
oom.close();
 } catch(IOException e) { }
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章