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

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


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

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

        對(duì)于單例類(lèi)要實(shí)現(xiàn)序列化時(shí),為了使反序列化能夠得到正確的結(jié)果,需要在類(lèi)增加一個(gè)readResole()方法。

        transient顯式聲明不對(duì)它序列化.

        serialVersionUID用來(lái)表示可序列化類(lèi)的不同版本的序列化兼容性。

        JavaSE中的Preferences API也提供了對(duì)象的持久性。Thinking in java中給出一個(gè)簡(jiǎn)單的例子。

       下面給出一個(gè)簡(jiǎn)單的序列化例子:

         

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);
    }
}