1. 程式人生 > >java中的Serializable介面的作用

java中的Serializable介面的作用

實現java.io.Serializable 介面的類是可序列化的。沒有實現此介面的類將不能使它們的任一狀態被序列化或逆序列化。

  序列化類的所有子類本身都是可序列化的。這個序列化介面沒有任何方法和域,僅用於標識序列化的語意。允許非序列化類的子型別序列化,子型別可以假定負責儲存和恢復父型別的公有的、保護的和(如果可訪問)包的域的狀態。只要該類(擴充套件)有一個無參構造子,可初始化它的狀態,那麼子型別就可承擔上述職責。在這種情況下申明一個可序列化的類是一個錯誤。此錯誤將在執行時被檢測。就是可以把物件存到位元組流,然後可以恢復!
  例如:Integer實現了Serializable,所以可以把一個Integer的物件用IO寫到檔案裡,之後再可以從檔案裡讀出,如你開始寫入的時候那個物件的intValue() 是5的話,那讀出來之後也是5。這一點體現了用序化類的作用,即用來傳送類的物件。

  所謂的Serializable,就是java提供的通用資料儲存和讀取的介面。至於從什麼地方讀出來和儲存到哪裡去都被隱藏在函式引數的背後了。這樣子,任何型別只要實現了Serializable介面,就可以被儲存到檔案中,或者作為資料流通過網路傳送到別的地方。也可以用管道來傳輸到系統的其他程式中。這樣子極大的簡化了類的設計。只要設計一個儲存一個讀取功能就能解決上面說得所有問題。

Object serialization的定義:
Object serialization 允許你將實現了Serializable介面的物件轉換為位元組序列,這些位元組序列可以被完全儲存以備以後重新生成原來的物件。


serialization不但可以在本機做,而且可以經由網路操作(RMI)。這個好處是很大的----因為它自動遮蔽了作業系統的差異,位元組順序(用Unix下的c開發過網路程式設計的人應該知道這個概念)等。比如,在Window平臺生成一個物件並序列化之,然後通過網路傳到一臺Unix機器上,然後可以在這臺Unix機器上正確地重構這個物件。


Object serialization主要用來支援2種主要的特性:
1。Java的RMI(remote method invocation).RMI允許象在本機上一樣操作遠端機器上的物件。當傳送訊息給遠端物件時,就需要用到serializaiton機制來發送引數和接收返回直。

2。Java的JavaBeans. Bean的狀態資訊通常是在設計時配置的。Bean的狀態資訊必須被存起來,以便當程式執行時能恢復這些狀態資訊。這也需要serializaiton機制。



二。sakulagi和rollingpig說的持久化我也說一下。
我覺得你們說的應該是英文裡的persistence.但是Java語言裡現在只支援lightweight persistence,就是輕量級持久化,這是通過serialization機制來實現的。

persistence是指一個物件的生命週期不由程式是否執行來決定,即使是在程式終止時這個物件也存在。它把一個serializable的物件寫到磁碟(本機或其他機器上的非RAM儲存器),並在程式重新呼叫時再讀取物件到通常的RAM儲存器。

為什麼說Java的serialization機制實現的是lightweight persistence?因為你必須顯式的序列化和反序列化程式裡的物件;而不是直接由一個關鍵詞來定義一個物件是序列化的然後由系統做相應的處理。


下面是關於序列化的一個例項:

程式名稱:SerializationDemo.java
程式主題:實現物件的序列化和反序列化
程式說明:該程式由例項化一個MyClass類的物件開始,該物件有三個例項變數,型別分別為String、int、double,是希望儲存和恢復的資訊。

程式碼內容


import java.io.*;




public class SerializationDemo{


          public static void main(String args[]){




//Object serialization


try{


MyClass object1=new MyClass("Hello",-7,2.7e10);


System.out.println("object1:"+object1);


FileOutputStream fos=new FileOutputStream("serial");


ObjectOutputStream oos=new ObjectOutputStream(fos);


oos.writeObject(object1);


oos.flush();


oos.close();


}


catch(Exception e){


System.out.println("Exception during serialization:"+e);


System.exit(0);


}




//Object deserialization


try{


MyClass object2;


FileInputStream fis=new FileInputStream("serial");


ObjectInputStream ois=new ObjectInputStream(fis);


object2=(MyClass)ois.readObject();


ois.close();


System.out.println("object2:"+object2);


}


catch(Exception e){


System.out.println("Exception during deserialization:"+e);


System.exit(0);


}


}


}




class MyClass implements Serializable{


String s;


int i;


double d;


public MyClass(String s,int i,double d){


    this.s=s;


    this.i=i;


    this.d=d;


}


public String toString(){


    return "s="+s+";i="+i+";d="+d;


}


}




程式執行結果:object1和object2的例項變數是一樣的,輸出如下:

object1:s=Hello;i=-7;d=2.7E10 
object2:s=Hello;i=-7;d=2.7E10