天天看點

java中的Serializable接口

    序列化是把一個對象的狀态寫入一個位元組流的過程,它執行RMI,RMI允許一台機器上的JAVA對象調用不同機器上的JAVA對象方法,對象可以作為參數提供給那個遠端方法,發送機序列化該對象并傳送它,接收機執行反序列化。

序列化和反序列化的關系圖表可形成包含循環引用的順序圖表。這是整個序列化的總體思想。

而Serializable接口屬于支援序列化的一個接口,隻有一個實作它的對象可以被序列化工具存儲和回複,Serializable接口沒有定義任何成員,隻用來表示一個累可以被序列化,若該類可以序列化,那麼它的所有子類都可以。

下面是關于序列化的一個執行個體:

程式名稱: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

----------------------------------------------------------

補充一下:

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機制。

二、持久化

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

persistence是指一個對象的生命周期不由程式是否執行來決定,即使是在程式終止時這個對象也存在。它把一個serializable的對象寫到磁盤(本機或其他機器上的非RAM存儲器),并在程式重新調用時再讀取對象到通常的RAM存儲器。

為什麼說Java的serialization機制實作的是lightweight persistence?因為你必須顯式的序列化和反序列化程式裡的對象;而不是直接由一個關鍵詞來定義一個對象是序列化的然後由系統做相應的處理。  如果以後的Java版本出現一個新的關鍵字來實作這種機制,比如就是persistence,如果我用

persistence  (String s="chinaunix")

然後系統自動做程式裡的那些處理,那麼Java就實作了persistence.