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

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

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

    JAVA

    人生若只如初見,何事秋風悲畫扇。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      50 隨筆 :: 25 文章 :: 157 評論 :: 0 Trackbacks

      類通過實現(xiàn) java.io.Serializable 接口以啟用其序列化功能。未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。可序列化類的所有子類型本身都是可序列化的。序列化接口沒有方法或字段,僅用于標識可序列化的語義。

      Java的"對象序列化"能讓你將一個實現(xiàn)了Serializable接口的對象轉(zhuǎn)換成一組byte,這樣日后要用這個對象時候,你就能把這些byte數(shù)據(jù)恢復出來,并據(jù)此重新構(gòu)建那個對象了。

      要想序列化對象,你必須先創(chuàng)建一個OutputStream,然后把它嵌進ObjectOutputStream。這時,你就能用writeObject( )方法把對象寫入OutputStream了。

      writeObject 方法負責寫入特定類的對象的狀態(tài),以便相應的 readObject 方法可以還原它。通過調(diào)用 out.defaultWriteObject 可以調(diào)用保存 Object 的字段的默認機制。該方法本身不需要涉及屬于其超類或子類的狀態(tài)。狀態(tài)是通過使用 writeObject 方法或使用 DataOutput 支持的用于基本數(shù)據(jù)類型的方法將各個字段寫入 ObjectOutputStream 來保存的。

      讀的時候,你得把InputStream嵌到ObjectInputStream里面,然后再調(diào)用readObject( )方法。不過這樣讀出來的,只是一個Object的reference,因此在用之前,還得先下傳。readObject 方法負責從流中讀取并還原類字段。它可以調(diào)用 in.defaultReadObject 來調(diào)用默認機制,以還原對象的非靜態(tài)和非瞬態(tài)字段。

       defaultReadObject 方法使用流中的信息來分配流中通過當前對象中相應命名字段保存的對象的字段。這用于處理類發(fā)展后需要添加新字段的情形。該方法本身不需要涉及屬于其超類或子類的狀態(tài)。狀態(tài)是通過使用 writeObject 方法或使用 DataOutput 支持的用于基本數(shù)據(jù)類型的方法將各個字段寫入 ObjectOutputStream 來保存的。

      看一個列子:

    import ?java.io. * ;?

    class ?tree? implements ?java.io.Serializable? {?
    ????
    public ?tree?left;?
    ????
    public ?tree?right;?
    ????
    public ? int ?id;?
    ????
    public ? int ?level;?

    ????
    private ? static ? int ?count? = ? 0 ;?

    ????
    public ?tree( int ?depth)? {?
    ????????id?
    = ?count ++ ;?
    ????????level?
    = ?depth;?
    ????????
    if ?(depth? > ? 0 )? {?
    ????????????left?
    = ? new ?tree(depth - 1 );?
    ????????????right?
    = ? new ?tree(depth - 1 );?
    ????????}
    ?
    ????}
    ?

    ????
    public ? void ?print( int ?levels)? {?
    ????????
    for ?( int ?i? = ? 0 ;?i? < ?level;?i ++ )?
    ????????????System.out.print(
    " ?? " );?
    ????????System.out.println(
    " node? " ? + ?id);?

    ????????
    if ?(level? <= ?levels? && ?left? != ? null )?
    ????????????left.print(levels);?

    ????????
    if ?(level? <= ?levels? && ?right? != ? null )?
    ????????????right.print(levels);?
    ????}
    ?


    ????
    public ? static ? void ?main?(String?argv[])? {?

    ????????
    try ? {?
    ????????????
    /* ?創(chuàng)建一個文件寫入序列化樹。? */ ?
    ????????????FileOutputStream?ostream?
    = ? new ?FileOutputStream( " tree.tmp " );?
    ????????????
    /* ?創(chuàng)建輸出流? */ ?
    ????????????ObjectOutputStream?p?
    = ? new ?ObjectOutputStream(ostream);?

    ????????????
    /* ?創(chuàng)建一個二層的樹。? */ ?
    ????????????tree?base?
    = ? new ?tree( 2 );?

    ????????????p.writeObject(base);?
    // ?將樹寫入流中。?
    ????????????p.writeObject( " LiLy?is?惠止南國 " );
    ????????????p.flush();?
    ????????????ostream.close();????
    // ?關(guān)閉文件。?

    ????????????
    /* ?打開文件并設(shè)置成從中讀取對象。? */ ?
    ????????????FileInputStream?istream?
    = ? new ?FileInputStream( " tree.tmp " );?
    ????????????ObjectInputStream?q?
    = ? new ?ObjectInputStream(istream);?

    ????????????
    /* ?讀取樹對象,以及所有子樹? */ ?
    ????????????tree?new_tree?
    = ?(tree)q.readObject();?

    ????????????new_tree.print(
    2 );?? // ?打印出樹形結(jié)構(gòu)的最上面?2級?
    ????????????String?name? = ?(String)q.readObject();
    ????????????System.out.println(
    " \n " + name);
    ????????}
    ? catch ?(Exception?ex)? {?
    ????????????ex.printStackTrace();?
    ????????}
    ?
    ????}
    ?
    }
    ?

    ?

      最后結(jié)果如下:

    ??? node 0
    ? node 1
    node 2
    node 3
    ? node 4
    node 5
    node 6

    LiLy is 惠止南國

      可以看到,在序列化的時候,writeObject與readObject之間的先后順序。readObject將最先write的object read出來。用數(shù)據(jù)結(jié)構(gòu)的術(shù)語來講就姑且稱之為先進先出吧!

      在序列化時,有幾點要注意的:
      1:當一個對象被序列化時,只保存對象的非靜態(tài)成員變量,不能保存任何的成員方法和靜態(tài)的成員變量。
      2:如果一個對象的成員變量是一個對象,那么這個對象的數(shù)據(jù)成員也會被保存。
     ?。常喝绻粋€可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,并且會拋出一個NotSerializableException。我們可以將這個引用標記為transient,那么對象仍然可以序列化

      還有我們對某個對象進行序列化時候,往往對整個對象全部序列化了,比如說類里有些數(shù)據(jù)比較敏感,不希望序列化,一個方法可以用transient來標識,另一個方法我們可以在類里重寫

    private ? void ?readObject(java.io.ObjectInputStream?stream)
    ?????
    throws
    ?IOException,?ClassNotFoundException;
    ?
    private ? void
    ?writeObject(java.io.ObjectOutputStream?stream)
    ?????
    throws
    ?IOException

      這二個方法!
      示例:

    import ?java.io. * ;

    class ?ObjectSerialTest
    {
    ????
    public ? static ? void ?main(String[]?args)? throws ?Exception
    ????
    {
    ????????Employee?e1
    = new ?Employee( " zhangsan " , 25 , 3000.50 );
    ????????Employee?e2
    = new ?Employee( " lisi " , 24 , 3200.40 );
    ????????Employee?e3
    = new ?Employee( " wangwu " , 27 , 3800.55 );
    ????????
    ????????FileOutputStream?fos
    = new ?FileOutputStream( " employee.txt " );
    ????????ObjectOutputStream?oos
    = new ?ObjectOutputStream(fos);
    ????????oos.writeObject(e1);
    ????????oos.writeObject(e2);
    ????????oos.writeObject(e3);
    ????????oos.close();
    ????????
    ????????FileInputStream?fis
    = new ?FileInputStream( " employee.txt " );
    ????????ObjectInputStream?ois
    = new ?ObjectInputStream(fis);
    ????????Employee?e;
    ????????
    for ( int ?i = 0 ;i < 3 ;i ++ )
    ????????
    {
    ????????????e
    = (Employee)ois.readObject();
    ????????????System.out.println(e.name
    + " : " + e.age + " : " + e.salary);
    ????????}

    ????????ois.close();
    ????}

    }


    class ?Employee? implements ?Serializable
    {
    ????String?name;
    ????
    int ?age;
    ????
    double ?salary;
    ????
    transient ?Thread?t = new ?Thread();
    ????
    public ?Employee(String?name, int ?age, double ?salary)
    ????
    {
    ????????
    this .name = name;
    ????????
    this .age = age;
    ????????
    this .salary = salary;
    ????}

    ????
    private ? void ?writeObject(java.io.ObjectOutputStream?oos)? throws ?IOException
    ????
    {
    ????????oos.writeInt(age);
    ????????oos.writeUTF(name);
    ????????System.out.println(
    " Write?Object " );
    ????}

    ????
    private ? void ?readObject(java.io.ObjectInputStream?ois)? throws ?IOException
    ????
    {
    ????????age
    = ois.readInt();
    ????????name
    = ois.readUTF();
    ????????System.out.println(
    " Read?Object " );
    ????}


    }

     ?。?add on 2006/6/28)
    ?

    參考資料:JDK1.5 API DOC  孫鑫老師資料

    posted on 2006-05-10 12:47 Jkallen 閱讀(4521) 評論(5)  編輯  收藏 所屬分類: JEE學習

    評論

    # re: 初探序列化---Serializable 2006-08-25 10:21 le
    講的不錯,很清楚.  回復  更多評論
      

    # re: 初探序列化---Serializable 2006-10-14 18:06 Sol
    不錯,頂  回復  更多評論
      

    # re: 初探序列化---Serializable 2007-04-28 18:31 吼吼
    自己比著例子做的,才發(fā)現(xiàn)是怎么回事  回復  更多評論
      

    # re: 初探序列化---Serializable[未登錄] 2007-07-26 14:10 binbin
    謝謝....  回復  更多評論
      

    # re: 初探序列化---Serializable 2007-08-21 18:03 555
    555!  回復  更多評論
      

    主站蜘蛛池模板: 亚洲精品国产情侣av在线| 国产精品久久香蕉免费播放| 亚洲色中文字幕无码AV| 思思久久99热免费精品6| 亚洲国产午夜电影在线入口| 国产一区二区免费| 亚洲成AV人片在线观看无| 搡女人免费免费视频观看| 国产∨亚洲V天堂无码久久久| 人妻在线日韩免费视频| 亚洲AV无码久久寂寞少妇| 久久午夜羞羞影院免费观看| 亚洲综合男人的天堂色婷婷| 在线观看免费av网站| 亚洲伦理一二三四| 免费爱爱的视频太爽了| 免费无码专区毛片高潮喷水| 亚洲伊人久久精品影院| 久久国产精品一区免费下载| 亚洲国产高清美女在线观看| 女人与禽交视频免费看| 一级特黄色毛片免费看| 久久久亚洲精品无码| 91情侣在线精品国产免费| 青青青亚洲精品国产| 亚洲精品高清无码视频| 成人午夜免费福利视频| 美国毛片亚洲社区在线观看| 久久亚洲AV无码西西人体| 久久免费国产视频| 亚洲国产精品免费观看| 亚洲爽爽一区二区三区| 91成人在线免费观看| 豆国产96在线|亚洲| 亚洲AV无码不卡在线播放| 成年女人色毛片免费看| xxxxxx日本处大片免费看| 亚洲第一页在线观看| 亚洲成A人片77777国产| 最近免费2019中文字幕大全| 精品亚洲视频在线|