<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-11  評論-10  文章-8  trackbacks-0
    ??? 序列化是將對象變為連續的字節流,用于對象的持久化,網絡傳輸等場合

    一個類希望能被序列化必須實現 Serializable 接口,Serializable 本身并沒有聲明任何
    方法,只是起標記作用。可序列化類的子類自然也是可序列化的。因而實現序列化是非常方
    便的,只要在類的聲明時添加 implenment Serializable 就可以了,java 虛擬機會幫你處
    理剩下的工作。序列化是遞歸的,一個類想要序列化則它的所有數據成員都必須是可以序列
    化的,否則在序列化時會拋出 NotSerializableException 異常。jsdk 中基本數據類型的
    封裝類(Integer, Float etc),Component 都是可序列化的,如果容器中的對象都是可
    序列化的,則容器時可序列化的。java.lang.refect 包中的類不能序列化,Socket,
    URLConnection 不能序列化。

    對于只實現了 Serializable 接口的類,可以想象 java 是如何將它們序列化的:首先要利
    用反射機制得到所有需要序列化的數據成員,包括 private 成員,得到 private 成員的過
    程是非常規的,必定要經過嚴格的權限和安全檢查。所以用 java 自己的序列化方式開銷是
    非常大的,這也是為什么會有這篇文章的原因,這里要討論 java 提供的可以由我們自己控
    制的序列化對象的方式。

    覆寫
    private void writeObject(ObjectOutputStream out)
    private void readObject(ObjectInputStream in)

    這兩個方法會在對象序列化和反序列化時被調用,通過覆寫這兩個方法我們可以完全控制整
    個序列化的過程。我們注意到這兩個方法都是 private ,這意味我們無法顯示的調用這兩
    個方法,而 java 虛擬機在調用這兩個方法時也必然要經過嚴格的權限和安全檢查。與傳統
    的序列化方式(只實現 Serializable 接口)相比,這種方法減少了利用反射的次數以及獲
    取 private 成員所需要的額外開銷,因為在這兩個方法中所有的數據成員都是可以自由使
    用的

    實現 Externalizable 接口
    該接口中定義了兩個方法
    public void readExternal(ObjectInput in) throws IOException
    public void writeExternal(ObjectOutput out)
    ?????? throws IOException, ClassNotFoundException

    這兩個方法會在對象序列化和反序列化時被調用。很明顯這兩個方法都是 public 的,所以
    我們可以顯示的將一個對象序列化到一個輸出流,而 java 虛擬機在調用這兩個方法時也不
    會有任何的限制。

    ANY-ACCESS_MODIFIER Object writeReplace() throws ObjectStreamException;
    ANY-ACCESS_MODIFIER Object readResolve() throws ObjectStreamException;
    這兩個方法在序列化和反序列化時被調用,可以替換將要寫入或讀出的對象,在實現Singleton模式
    時可能會用到

    這三種方法實現序列化效率是顯而易見的:傳統方式最慢,實現 Externalizable 接口方式
    最快。但自己控制序列化過程有個明顯的缺點就是當類的數據成員改變時,序列化過程也同
    時需要修改,相反這正好是傳統方式的優點:任何改動都不會影響對象的正確序列化,虛擬
    機會幫你完成一切工作,雖然不算出色。

    當我們考慮性能問題時,序列化總應該是我們首先要注意的方面,尤其是那些只實現了
    Serializable 接口的類,它們往往就是性能的瓶頸所在,特別是一些對象需要反復的被序
    列化和反序列化,實現 Externalizable 接口會給你不小的驚喜。而對于實現
    Externalizable 接口后需要保持數據成員和序列化方法一致的問題實際算不上問題,因為
    當我們考慮性能問題時應該已經到了編碼的最后階段,這時整體框架和數據結構都已經非常
    穩定了,數據成員被修改的可能已經非常低了,即使被修改了,能大幅提高性能,多寫兩行代
    碼也不是令人沮喪的事情。

    以上只是單純的討論序列化的過程,實際上序列化總是和 I/O 操作同時發生,因為序列化
    就是為了傳輸或是存儲,所以對 I/O 的優化方法在這里也是同樣適用的。

    使用ObjectOutputStream.writeObject()時,在流的內部會有一個引用緩存,所有已經寫入流的
    對象如果再次被寫入則直接使用以前引用而不重新傳輸新的對象,這樣可以提到流的效率,但同樣帶來
    問題,一個對象寫入流后,被修改,再次寫入流,再另一端ObjectInputStream得到的是
    兩個相同的對象,這一點一定要注意

    posted on 2005-09-09 14:07 JBahamut 閱讀(640) 評論(3)  編輯  收藏

    評論:
    # re: 關于對象序列化的研究 2006-03-11 19:46 | marco zhang
    看來都是做java開發的,同好。

    多交流。呵呵。  回復  更多評論
      
    # re: 關于對象序列化的研究 2006-03-11 19:46 | marco zhang
    看來都是做java開發的,同好。

    多交流。呵呵。  回復  更多評論
      
    # re: 關于對象序列化的研究 2009-06-18 19:30 | na
    很好  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲一卡一卡二新区无人区| 亚洲a级成人片在线观看| 男女猛烈激情xx00免费视频| 免费高清小黄站在线观看 | 成人黄网站片免费视频| 中文字幕亚洲无线码| 好男人资源在线WWW免费| 国产亚洲福利精品一区| a毛片免费观看完整| 亚洲人成网站在线播放影院在线| 曰批视频免费40分钟试看天天| 久久精品亚洲精品国产色婷| 国产精品成人免费福利| 色偷偷女男人的天堂亚洲网| 在线观看91精品国产不卡免费| 男女男精品网站免费观看| 亚洲精品自产拍在线观看| 午夜免费福利小电影| 亚洲一区二区免费视频| 日韩高清免费观看| a一级爱做片免费| 亚洲AV本道一区二区三区四区| 91精品成人免费国产片| 亚洲爆乳少妇无码激情| 亚洲一区爱区精品无码| 30岁的女人韩剧免费观看| 亚洲中文字幕精品久久| 亚洲午夜AV无码专区在线播放| 人妻在线日韩免费视频| 亚洲一区二区三区在线| 免费观看日本污污ww网站一区| 国产免费一区二区三区不卡| 亚洲乱码一区av春药高潮| 亚洲国产成人久久综合野外| 久久久久国产精品免费免费不卡| 国产成人精品日本亚洲专一区| 亚洲乱码中文字幕手机在线| 57pao一国产成永久免费| 精品亚洲成A人在线观看青青| 国产亚洲精品自在久久| 免费观看a级毛片|