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

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

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

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數據加載中……

    Java I/O中的對象序列化

    作者:Flyingis

          Java對象序列化將那些實現了Serializable接口的對象轉換成一個字節序列,并能夠以后將這個字節序列完全恢復為原來的對象。利用對象的序列化,可以實現輕量級持久性,這意味著一個對象的生存周期并不取決于程序是否正在執行,它可以生存于程序的調用之間。通過將一個序列化對象寫入磁盤,然后在重新調用程序時恢復該對象,就能夠實現持久性的效果。JDOHibernate等中間件為我們提供了更規范、完善的持久化機制,這里所述只是最基本的基于文件I/O的持久化。

    對象序列化主要是為了支持兩種主要的特性,一是Java遠程方法調用(RMI),另外一個是序列化Java Beans

    1.        實現了Serializable接口的對象的序列化

    要序列化一個對象,首先要創建OutputStream對象,然后將其封裝在一個ObjectOutputStream對象內。此時,調用writeObject()方法將對象序列化并發送給OutputStream。在反序列化時,需要將一個InputStream封裝在ObjectInputStream內,然后調用readObject(),得到的結果是一個Object對象,需要進行轉型得到最后所需的對象。需要注意的是,在對一個Serializable對象進行反序列化的過程中,沒有調用任何構造器,包括缺省的構造器,整個對象都是通過從InputStream中取得數據恢復過來的。對象序列化是面向字節的,因此采用InputStreamOutputStream層次結構。

    2.        實現了Externalizable接口的對象的序列化

    Externalizable接口繼承了Serializable接口,同時添加了writeExternal()readExternal(),它們在序列化和反序列化過程中會被自動調用。出于安全的考慮,可以將需要序列化的對象在上述方法中顯式處理,否則不用在上述兩個方法內考慮。注意,對于實現了Serializable接口的對象,對象完全以它存儲的二進制位為基礎來構造,不調用構造器。而對于一個Externalizable對象,所有普通的缺省構造器都會被調用,然后調用readExternal()

    3.        transient關鍵字

    在某些情況下,有些特定的子對象不希望Java序列化機制自動保存與恢復,即使對象中的這些信息是private的,經過序列化處理,就可以通過讀取文件或者攔截網絡傳輸的方式來訪問到它。實現了Externalizable接口的對象的writeExternal()方法可以對需要的對象進行顯式的序列化,但是如果我們操作的是一個實現了Serializable接口的對象,就只能用transient關鍵字逐個字段的關閉序列化,只需要在字段定義前加上該關鍵字即可。

    4.        實現了Serializable接口的同時,提供兩個方法

    private void writeObject(ObjectOutputStream stream) throws IOException

    private void readObject(ObjectInputStream stream)

    throws IOException, ClassNotFoundException

    這種方法使用起來比較混亂,僅僅提供了這樣的一種功能,絕大多數情況下,使用前面三種方法就能滿足需求。

    posted on 2006-01-08 13:13 Flyingis 閱讀(2629) 評論(5)  編輯  收藏 所屬分類: JavaSE

    評論

    # re: Java I/O中的對象序列化  回復  更多評論   

    第四種Serializable才是提倡的做法。建議讀讀Effective Java中關于Serializable那章
    2006-01-12 10:26 | riverbuilding

    # re: Java I/O中的對象序列化  回復  更多評論   

    第四種理解起來有些晦澀,有時間我會進行考證。
    2006-01-12 10:40 | Flyingis

    # re: Java I/O中的對象序列化  回復  更多評論   

    >在對一個Serializable對象進行反序列化的過程中,沒有調用任何構造器,包括缺省的構造器

    抱歉又要挑刺了,Serializable對象在反序列化時,是要調用缺省構造函數的,否則 JVM 怎么知道多了一個對象實例?
    2006-01-13 13:53 | 笨笨

    # re: Java I/O中的對象序列化  回復  更多評論   

    @ 笨笨
    每一次復習都會帶來許多新的體會,也會存在知識的盲點,本來就是學習,歡迎你隨時挑刺。
    關于Serializable對象進行反序列化的過程中是否調用構造器,我在網上搜索了一下,沒找到確切的答案。這句話源自《Thinking in Java 3rd》。
    2006-01-14 12:45 | Flyingis

    # re: Java I/O中的對象序列化  回復  更多評論   

    沒有最后一種的話,以前java不能實現真正的singleton pattern的。
    最后一種很有用。
    2006-01-22 13:50 | 程序員
    主站蜘蛛池模板: 人禽杂交18禁网站免费| 精品无码人妻一区二区免费蜜桃| 黄色免费在线观看网址| 国产美女视频免费观看的网站 | 午夜网站在线观看免费完整高清观看| 国产午夜精品久久久久免费视| 久别的草原电视剧免费观看| 日韩在线播放全免费| 蜜桃精品免费久久久久影院| 内射无码专区久久亚洲| 亚洲精品无码久久久久| 亚洲资源在线视频| 亚洲精品国产首次亮相| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 亚洲一级免费视频| 嫩草影院免费观看| 亚洲爽爽一区二区三区| 亚洲AV成人一区二区三区AV| 亚洲伊人久久大香线蕉| 亚洲.国产.欧美一区二区三区| www在线观看免费视频| 亚洲欧洲免费视频| 麻豆国产VA免费精品高清在线 | 亚洲高清偷拍一区二区三区 | 亚洲激情在线观看| 亚洲精品蜜夜内射| 中文字幕乱码系列免费| 成人黄色免费网站| 亚洲А∨精品天堂在线| 91亚洲导航深夜福利| 久久亚洲精品无码网站| a毛片免费全部在线播放**| 国产卡二卡三卡四卡免费网址| 免费女人18毛片a级毛片视频| 亚洲91av视频| 最新亚洲人成网站在线观看| 日韩电影免费观看| 国产真人无遮挡作爱免费视频| 亚洲AV无码成人精品区蜜桃 | 综合偷自拍亚洲乱中文字幕| 毛片无码免费无码播放 |