比較java_io_Externalizable和Serializable

即使你沒有用過對象序列化(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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章