即使你沒有用過對象序列化(serialization),你可能也知道它。但你是否知道 Java 還支持另外一種形式的對象持久化,外部化(externalization)?
下面是序列化和外部化在代碼級的關(guān)聯(lián)方式:
public interface Serializable {}
public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}
序列化和外部化的主要區(qū)別
外部化和序列化是實(shí)現(xiàn)同一目標(biāo)的兩種不同方法。下面讓我們分析一下序列化和外部化之間的主要區(qū)別。
通過Serializable接口對對象序列化的支持是內(nèi)建于核心 API 的,但是java.io.Externalizable的所有實(shí)現(xiàn)者必須提供讀取和寫出的實(shí)現(xiàn)。Java 已經(jīng)具有了對序列化的內(nèi)建支持,也就是說只要制作自己的類java.io.Serializable,Java 就會試圖存儲和重組你的對象。如果使用外部化,你就可以選擇完全由自己完成讀取和寫出的工作,Java 對外部化所提供的唯一支持是接口:
voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)
現(xiàn)在如何實(shí)現(xiàn)readExternal() 和writeExternal() 就完全看你自己了。
序列化會自動存儲必要的信息,用以反序列化被存儲的實(shí)例,而外部化則只保存被存儲的類的標(biāo)識。當(dāng)你通過java.io.Serializable接口序列化一個(gè)對象時(shí),有關(guān)類的信息,比如它的屬性和這些屬性的類型,都與實(shí)例數(shù)據(jù)一起被存儲起來。在選擇走Externalizable這條路時(shí),Java 只存儲有關(guān)每個(gè)被存儲類型的非常少的信息。
每個(gè)接口的優(yōu)點(diǎn)和缺點(diǎn)
Serializable接口
· 優(yōu)點(diǎn):內(nèi)建支持
· 優(yōu)點(diǎn):易于實(shí)現(xiàn)
· 缺點(diǎn):占用空間過大
· 缺點(diǎn):由于額外的開銷導(dǎo)致速度變比較慢
Externalizable接口
· 優(yōu)點(diǎn):開銷較少(程序員決定存儲什么)
· 優(yōu)點(diǎn):可能的速度提升
· 缺點(diǎn):虛擬機(jī)不提供任何幫助,也就是說所有的工作都落到了開發(fā)人員的肩上。
在兩者之間如何選擇要根據(jù)應(yīng)用程序的需求來定。Serializable通常是最簡單的解決方案,但是它可能會導(dǎo)致出現(xiàn)不可接受的性能問題或空間問題;在出現(xiàn)這些問題的情況下,Externalizable可能是一條可行之路。
要記住一點(diǎn),如果一個(gè)類是可外部化的(Externalizable),那么Externalizable方法將被用于序列化類的實(shí)例,即使這個(gè)類型提供了Serializable方法:
private void writeObject()
private void readObject()