当两个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);
    }
}