java中的Serializable接口的做用

實現java.io.Serializable 接口的類是可序列化的。沒有實現此接口的類將不能使它們的任一狀態被序列化或逆序列化。
  序列化類的全部子類自己都是可序列化的。這個序列化接口沒有任何方法和域,僅用於標識 序列化的語意。容許非序列化類的子類型序列化,子類型能夠假定負責保存和恢復父類型的公有的、保護的和(若是可訪問)包的域的狀態。只要該類(擴展)有一 個無參構造子,可初始化它的狀態,那麼子類型就可承擔上述職責。在這種狀況下申明一個可序列化的類是一個錯誤。此錯誤將在運行時被檢測。就是能夠把對象存 到字節流,而後能夠恢復!
  例如:Integer實現了Serializable,因此能夠把一個Integer的對象用IO寫到文件裏,以後再能夠從文件裏讀出,如你開始寫入的時候那個對象的intValue() 是5的話,那讀出來以後也是5。這一點體現了用序化類的做用,即用來傳送類的對象。

  所謂的Serializable,就是java提供的通用數據保存和讀取的接口。至於從什麼地方讀出來和保存到哪裏去都被隱藏在函數參數的背後了。這樣子,任何類型只要實現了Serializable接口,就能夠被保存到文件中,或者做爲數據流經過網絡發送到別的地方。也能夠用管道來傳輸到系統的其餘程序中。這樣子極大的簡化了類的設計。只要設計一個保存一個讀取功能就能解決上面說得全部問題。
java

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
相關文章
相關標籤/搜索