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