<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, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    Java I/O中的對象序列化

    作者:Flyingis

          Java對象序列化將那些實(shí)現(xiàn)了Serializable接口的對象轉(zhuǎn)換成一個(gè)字節(jié)序列,并能夠以后將這個(gè)字節(jié)序列完全恢復(fù)為原來的對象。利用對象的序列化,可以實(shí)現(xiàn)輕量級(jí)持久性,這意味著一個(gè)對象的生存周期并不取決于程序是否正在執(zhí)行,它可以生存于程序的調(diào)用之間。通過將一個(gè)序列化對象寫入磁盤,然后在重新調(diào)用程序時(shí)恢復(fù)該對象,就能夠?qū)崿F(xiàn)持久性的效果。JDO、Hibernate等中間件為我們提供了更規(guī)范、完善的持久化機(jī)制,這里所述只是最基本的基于文件I/O的持久化。

    對象序列化主要是為了支持兩種主要的特性,一是Java遠(yuǎn)程方法調(diào)用(RMI),另外一個(gè)是序列化Java Beans。

    1.        實(shí)現(xiàn)了Serializable接口的對象的序列化

    要序列化一個(gè)對象,首先要?jiǎng)?chuàng)建OutputStream對象,然后將其封裝在一個(gè)ObjectOutputStream對象內(nèi)。此時(shí),調(diào)用writeObject()方法將對象序列化并發(fā)送給OutputStream。在反序列化時(shí),需要將一個(gè)InputStream封裝在ObjectInputStream內(nèi),然后調(diào)用readObject(),得到的結(jié)果是一個(gè)Object對象,需要進(jìn)行轉(zhuǎn)型得到最后所需的對象。需要注意的是,在對一個(gè)Serializable對象進(jìn)行反序列化的過程中,沒有調(diào)用任何構(gòu)造器,包括缺省的構(gòu)造器,整個(gè)對象都是通過從InputStream中取得數(shù)據(jù)恢復(fù)過來的。對象序列化是面向字節(jié)的,因此采用InputStreamOutputStream層次結(jié)構(gòu)。

    2.        實(shí)現(xiàn)了Externalizable接口的對象的序列化

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

    3.        transient關(guān)鍵字

    在某些情況下,有些特定的子對象不希望Java序列化機(jī)制自動(dòng)保存與恢復(fù),即使對象中的這些信息是private的,經(jīng)過序列化處理,就可以通過讀取文件或者攔截網(wǎng)絡(luò)傳輸?shù)姆绞絹碓L問到它。實(shí)現(xiàn)了Externalizable接口的對象的writeExternal()方法可以對需要的對象進(jìn)行顯式的序列化,但是如果我們操作的是一個(gè)實(shí)現(xiàn)了Serializable接口的對象,就只能用transient關(guān)鍵字逐個(gè)字段的關(guān)閉序列化,只需要在字段定義前加上該關(guān)鍵字即可。

    4.        實(shí)現(xiàn)了Serializable接口的同時(shí),提供兩個(gè)方法

    private void writeObject(ObjectOutputStream stream) throws IOException

    private void readObject(ObjectInputStream stream)

    throws IOException, ClassNotFoundException

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

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

    評(píng)論

    # re: Java I/O中的對象序列化  回復(fù)  更多評(píng)論   

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

    # re: Java I/O中的對象序列化  回復(fù)  更多評(píng)論   

    第四種理解起來有些晦澀,有時(shí)間我會(huì)進(jìn)行考證。
    2006-01-12 10:40 | Flyingis

    # re: Java I/O中的對象序列化  回復(fù)  更多評(píng)論   

    >在對一個(gè)Serializable對象進(jìn)行反序列化的過程中,沒有調(diào)用任何構(gòu)造器,包括缺省的構(gòu)造器

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

    # re: Java I/O中的對象序列化  回復(fù)  更多評(píng)論   

    @ 笨笨
    每一次復(fù)習(xí)都會(huì)帶來許多新的體會(huì),也會(huì)存在知識(shí)的盲點(diǎn),本來就是學(xué)習(xí),歡迎你隨時(shí)挑刺。
    關(guān)于Serializable對象進(jìn)行反序列化的過程中是否調(diào)用構(gòu)造器,我在網(wǎng)上搜索了一下,沒找到確切的答案。這句話源自《Thinking in Java 3rd》。
    2006-01-14 12:45 | Flyingis

    # re: Java I/O中的對象序列化  回復(fù)  更多評(píng)論   

    沒有最后一種的話,以前java不能實(shí)現(xiàn)真正的singleton pattern的。
    最后一種很有用。
    2006-01-22 13:50 | 程序員
    主站蜘蛛池模板: 久久精品国产亚洲AV高清热| 亚洲高清中文字幕免费| 亚洲AV成人一区二区三区在线看 | 久久精品国产亚洲77777| 亚洲国产午夜福利在线播放| 成熟女人特级毛片www免费| 50岁老女人的毛片免费观看| 一级一黄在线观看视频免费| 亚洲精品一卡2卡3卡四卡乱码| 亚洲综合一区二区| 亚洲成熟xxxxx电影| 国产亚洲av片在线观看18女人| 日韩免费高清视频网站| 无限动漫网在线观看免费| 午夜视频在线免费观看| 四虎国产精品永免费| 亚洲AV成人无码网站| 亚洲日韩看片无码电影| 亚洲乱码在线播放| 久久亚洲精精品中文字幕| 国产亚洲大尺度无码无码专线| 亚洲AV中文无码乱人伦| 免费一级毛片免费播放| 日本免费一区二区三区最新vr| 免费国产黄线在线观看| 国产精品69白浆在线观看免费| **aaaaa毛片免费同男同女| 久久综合给合久久国产免费| 99re视频精品全部免费| 青青草原1769久久免费播放| 中文字幕免费在线看| 你是我的城池营垒免费观看完整版 | 国产亚洲情侣久久精品| 日韩色视频一区二区三区亚洲 | 丁香亚洲综合五月天婷婷| 免费h成人黄漫画嘿咻破解版| 国产男女猛烈无遮档免费视频网站 | 亚洲色婷婷综合久久| 亚洲线精品一区二区三区| 亚洲尤码不卡AV麻豆| 亚洲高清国产拍精品26U|