posts - 15,  comments - 8,  trackbacks - 0

          即使你沒有用過對象序列化(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 閱讀(162) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 阿克陶县| 丁青县| 桃园县| 鲁山县| 辉县市| 威宁| 洪雅县| 三穗县| 杭锦后旗| 万源市| 连山| 承德市| 抚顺县| 常山县| 库伦旗| 临猗县| 卢湾区| 鄂托克旗| 涞水县| 南木林县| 皮山县| 梓潼县| 西平县| 中超| 临桂县| 南昌县| 博湖县| 巴南区| 连云港市| 甘孜县| 淳安县| 桑植县| 孟连| 浙江省| 鹤山市| 垫江县| 梁平县| 夏河县| 藁城市| 长丰县| 文登市|