當兩個Java進程在網絡通信時,一個進程可以通過把Java對象轉換為字序列,使其在網絡上傳送,在接收方則需要把字節序列再恢復為Java對象。對象的序列化主要有兩種用途

1.把對象的字節序列永久地保存在硬盤,通常存放在一個文件中。
2.在網絽上傳送對象的字節序列。


        只有實現了SerializableExtenalizable接口的類對象才能被序列化。其中Extenalizable接口繼承Serializabler接口,實現Extenalizable接口完全由自身來控制序列化的行為,而僅實現Serializable接口的類可以采用默認的序列化方式。

        如果一個類實現Extenalizable接口,則它必須實現readExtenal(ObjectInput in)writeExtenal(ObjectOutput out)方法,并且在readExtenal中會先調用類的不帶參數的構造方法,所以類必須提供一個不帶參數的構造方法。而在實現Serializable接口的類中,它不用調用類的任何構造方法。對于實現Serializable的類,可以通過實現private void read/writeObject()來改變默認的序列化方式。

        對于單例類要實現序列化時,為了使反序列化能夠得到正確的結果,需要在類增加一個readResole()方法。

        transient顯式聲明不對它序列化.

        serialVersionUID用來表示可序列化類的不同版本的序列化兼容性。

        JavaSE中的Preferences API也提供了對象的持久性。Thinking in java中給出一個簡單的例子。

       下面給出一個簡單的序列化例子:

         

import java.io.*;
public class Customer implements Serializable {
    
private int age;
    
public Customer(int age ){
        
this.age = age;
    }
    
public String toString(){
        
return "age="+age;
    }
    
public static void main(String[] args)throws Exception{
        Customer custormer 
= new Customer(24);
        System.out.println(
"before Serializable: "+custormer);
        ByteArrayOutputStream buf 
= new ByteArrayOutputStream();
        ObjectOutputStream o 
= new ObjectOutputStream(buf);
        o.writeObject(custormer);

        
byte[] byteArray = buf.toByteArray();
        
        ObjectInputStream in 
= new ObjectInputStream(new ByteArrayInputStream(byteArray));
        custormer 
= (Customer)in.readObject();
        System.out.println(
"After Serializable:"+custormer);
    }
}