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

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

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

    JAVA

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

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

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

      Java的"對象序列化"能讓你將一個實現了Serializable接口的對象轉換成一組byte,這樣日后要用這個對象時候,你就能把這些byte數據恢復出來,并據此重新構建那個對象了。

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

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

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

       defaultReadObject 方法使用流中的信息來分配流中通過當前對象中相應命名字段保存的對象的字段。這用于處理類發展后需要添加新字段的情形。該方法本身不需要涉及屬于其超類或子類的狀態。狀態是通過使用 writeObject 方法或使用 DataOutput 支持的用于基本數據類型的方法將各個字段寫入 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 ? {?
    ????????????
    /* ?創建一個文件寫入序列化樹。? */ ?
    ????????????FileOutputStream?ostream?
    = ? new ?FileOutputStream( " tree.tmp " );?
    ????????????
    /* ?創建輸出流? */ ?
    ????????????ObjectOutputStream?p?
    = ? new ?ObjectOutputStream(ostream);?

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

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

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

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

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

    ?

      最后結果如下:

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

    LiLy is 惠止南國

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

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

      還有我們對某個對象進行序列化時候,往往對整個對象全部序列化了,比如說類里有些數據比較敏感,不希望序列化,一個方法可以用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 閱讀(4508) 評論(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 吼吼
    自己比著例子做的,才發現是怎么回事  回復  更多評論
      

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

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

    主站蜘蛛池模板: 国产一级婬片A视频免费观看| 99re6在线视频精品免费下载| 亚洲综合国产精品第一页| 国产一级一毛免费黄片| 亚洲人成网站18禁止久久影院| 日韩一品在线播放视频一品免费| 国产高清视频免费在线观看| 亚洲韩国在线一卡二卡| 国产不卡免费视频| 午夜影院免费观看| 无码一区二区三区亚洲人妻| 亚洲国产精品国自产电影| 日韩激情无码免费毛片| 无码中文字幕av免费放dvd| 亚洲女女女同性video| 亚洲AV午夜成人片| 全黄性性激高免费视频| 美女内射毛片在线看免费人动物| 免费精品视频在线| 亚洲国产成AV人天堂无码| 亚洲无线码在线一区观看| 在线不卡免费视频| 最近中文字幕大全免费视频| h视频免费高清在线观看| 亚洲 欧洲 视频 伦小说| 久久亚洲国产精品| 亚洲精品天堂成人片?V在线播放| 一个人免费观看www视频在线| 中文字幕不卡高清免费| 日本亚洲中午字幕乱码| 亚洲永久在线观看| 久久久无码精品亚洲日韩蜜臀浪潮 | eeuss影院www天堂免费| 亚洲国产成人99精品激情在线| 亚洲精品二区国产综合野狼| 国产无遮挡吃胸膜奶免费看视频| 91久久青青草原线免费| 最近免费字幕中文大全| 日韩在线观看免费| jzzijzzij在线观看亚洲熟妇| 亚洲一级特黄特黄的大片|