當兩個Java進程在網絡通信時,一個進程可以通過把Java對象轉換為字序列,使其在網絡上傳送,在接收方則需要把字節序列再恢復為Java對象。對象的序列化主要有兩種用途
1.把對象的字節序列永久地保存在硬盤,通常存放在一個文件中。
2.在網絽上傳送對象的字節序列。
只有實現了Serializable或Extenalizable接口的類對象才能被序列化。其中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中給出一個簡單的例子。
下面給出一個簡單的序列化例子:
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);
}
}