當(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)了Serializable或Extenalizable接口的類對象才能被序列化。其中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);
}
}