序列化是把一個對象的狀態寫入一個字節流的過程,它執行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