一陪拘、Externalizable簡(jiǎn)介
Externalizable接口繼承了Serializable接口休傍,用來(lái)在序列化時(shí)手動(dòng)的把需要的對(duì)象信息進(jìn)行序列化烟号。Externalizable接口提供了兩個(gè)方法:writeExternal(ObjectOuput out) 和 readExternal(ObjectInput in) 立美。在需要被序列化的類中實(shí)現(xiàn)這兩個(gè)方法癣籽,這樣在此類序列化時(shí)這兩個(gè)方法將被自動(dòng)執(zhí)行,用以可定制地序列化此類程拭。
一個(gè)例子
import java.io.*;
public class Country implements Externalizable {
private static final long serialVersionUID = 1L;
private String name;
private int code;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getCode() {
return this.code;
}
public void setCode(int code) {
this.code = code;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(name);
out.writeInt(code);
}
@Override
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException {
this.name = in.readUTF();
this.code = in.readInt();
}
}
import java.io.*;
public class Text {
public static void main(String[] args) throws Exception {
Country c = new Country();
c.setCode(374);
c.setName("Armenia");
FileOutputStream fileOutputStream
= new FileOutputStream(new File("./Country.txt"));
ObjectOutputStream objectOutputStream
= new ObjectOutputStream(fileOutputStream);
c.writeExternal(objectOutputStream);
objectOutputStream.flush();
objectOutputStream.close();
fileOutputStream.close();
FileInputStream fileInputStream
= new FileInputStream(new File("./Country.txt"));
ObjectInputStream objectInputStream
= new ObjectInputStream(fileInputStream);
Country c2 = new Country();
c2.readExternal(objectInputStream);
objectInputStream.close();
fileInputStream.close();
System.out.println(c2.getCode()); //374
System.out.println(c2.getName()); //Armenia
System.out.println(c2.getCode() == c.getCode()); //true
System.out.println(c2.getName().equals(c.getName())); //true
}
}
二定踱、Externalizable與Serializable的區(qū)別
- 關(guān)鍵區(qū)別是如何處理序列化過(guò)程。當(dāng)類實(shí)現(xiàn)Serializable接口時(shí)恃鞋,JVM完全負(fù)責(zé)類實(shí)例的序列化崖媚。在Externalizable的情況下,程序員應(yīng)該負(fù)責(zé)整個(gè)序列化和反序列化過(guò)程恤浪。
- 如果需要序列化整個(gè)對(duì)象畅哑,那么Serializable接口更適合。對(duì)于自定義序列化水由,可以使用Externalizable來(lái)對(duì)過(guò)程進(jìn)行控制荠呐。
- 通過(guò)使用transient關(guān)鍵字標(biāo)記字段,可以使用Serializable接口實(shí)現(xiàn)自定義序列化。JVM不會(huì)序列化特定字段泥张,但它會(huì)將字段添加到具有默認(rèn)值的文件存儲(chǔ)呵恢。
- 使用Externalizable時(shí),必須按照寫入時(shí)的確切順序讀取所有字段狀態(tài)媚创。否則會(huì)出現(xiàn)異常渗钉,而Serializable接口沒(méi)有這個(gè)要求。