即使你沒有用過對象序列化(serialization),你可能也知道它。但你是否知道 Java 還支持另外一種形式的對象持久化,外部化(externalization)?
下面是序列化和外部化在代碼級的關聯方式:
public interface Serializable
{}
public interface Externalizable
extends Serializable {
void readExternal(ObjectInput
in);
void writeExternal(ObjectOutput
out);
}
序列化和外部化的主要區別
外部化和序列化是實現同一目標的兩種不同方法。下面讓我們分析一下序列化和外部化之間的主要區別。
通過Serializable接口對對象序列化的支持是內建于核心 API
的,但是java.io.Externalizable的所有實現者必須提供讀取和寫出的實現。Java
已經具有了對序列化的內建支持,也就是說只要制作自己的類java.io.Serializable,Java
就會試圖存儲和重組你的對象。如果使用外部化,你就可以選擇完全由自己完成讀取和寫出的工作,Java 對外部化所提供的唯一支持是接口:
voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput
out)
現在如何實現readExternal() 和writeExternal() 就完全看你自己了。
序列化會自動存儲必要的信息,用以反序列化被存儲的實例,而外部化則只保存被存儲的類的標識。當你通過
java.io.Serializable接口序列化一個對象時,有關類的信息,比如它的屬性和這些屬性的類型,都與實例數據一起被存儲起來。在選擇走
Externalizable這條路時,Java 只存儲有關每個被存儲類型的非常少的信息。
每個接口的優點和缺點
Serializable接口
·
優點:內建支持
·
優點:易于實現
·
缺點:占用空間過大
·
缺點:由于額外的開銷導致速度變比較慢
Externalizable接口
·
優點:開銷較少(程序員決定存儲什么)
·
優點:可能的速度提升
·
缺點:虛擬機不提供任何幫助,也就是說所有的工作都落到了開發人員的肩上。
在兩者之間如何選擇要根據應用程序的需求來定。Serializable通常是最簡單的解決方案,但是它可能會導致出現不可接受的性能問題或空間問題;在出現這些問題的情況下,Externalizable可能是一條可行之路。
要記住一點,如果一個類是可外部化的(Externalizable),那么Externalizable方法將被用于序列化類的實例,即使這個類型提供了Serializable方法:
private void writeObject()
private void readObject()
本文作者:David Petersheim是Genscape公司的應用程序開發部主任。他設計和開發用于獲取和處理實時能源數據的服務器端應用程序。
posted on 2008-06-18 14:38
lvq810 閱讀(160)
評論(0) 編輯 收藏 所屬分類:
Java