當(dāng)兩個Java進(jìn)程在網(wǎng)絡(luò)通信時,一個進(jìn)程可以通過把Java對象轉(zhuǎn)換為字序列,使其在網(wǎng)絡(luò)上傳送,在接收方則需要把字節(jié)序列再恢復(fù)為Java對象。對象的序列化主要有兩種用途

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


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

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

        對于單例類要實(shí)現(xiàn)序列化時,為了使反序列化能夠得到正確的結(jié)果,需要在類增加一個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);
    }
}