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