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

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

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

    隨筆-126  評(píng)論-247  文章-5  trackbacks-0

    題目取得有點(diǎn)怪異,不管這個(gè),其實(shí)是要說一下 java 中的 java.io.Serializable 接口。

    首先,先來了解一下什么是 序列化  ( Serializable ) : 
     
        對(duì)象的壽命通常隨著生成該對(duì)象的程序塊的終止而終止。有時(shí)候,你可能需要將對(duì)象的狀態(tài)保存下來,在需要時(shí)再將對(duì)象恢復(fù)(反序列化)。

        我們把對(duì)象的這種能記錄自己的狀態(tài)以便將來再生的能力,叫做對(duì)象的持久性 ( persistence )。

        對(duì)象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己,這個(gè)過程就叫對(duì)象的序列化 ( Serialization ) 。

    類可以通過實(shí)現(xiàn) java.io.Serializable 接口來啟用其序列化功能。未實(shí)現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。

    類實(shí)現(xiàn) java.io.Serializable 接口,無需實(shí)現(xiàn)任何方法或字段,因?yàn)?java.io.Serializable 接口本身就沒有方法或字段,它僅用來標(biāo)識(shí)可序列化的語義。

    Java 序列化技術(shù)可以讓你將一個(gè)對(duì)象的狀態(tài)寫入到一個(gè) IO 流里,并且可以從其它地方把該 IO 流里的數(shù)據(jù)讀出來。重新構(gòu)造一個(gè)相同的對(duì)象。

    這就有點(diǎn)像你將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫里,然后再拿出來,這前后得到的東西是一樣的。它的這種機(jī)制允許你將對(duì)象通過網(wǎng)絡(luò)進(jìn)行傳播,

    并可以隨時(shí)把對(duì)象持久化到數(shù)據(jù)庫、文件等系統(tǒng)里。

    另外,序列化運(yùn)行時(shí)使用一個(gè)稱為 serialVersionUID 的版本號(hào)與每個(gè)可序列化類相關(guān)聯(lián),

    該序列號(hào)在反序列化過程中用于驗(yàn)證序列化對(duì)象的發(fā)送者和接收者是否為該對(duì)象加載了與序列化兼容的類。

    如果接收者加載的該對(duì)象的類的 serialVersionUID 與對(duì)應(yīng)的發(fā)送者的類的版本號(hào)不同,則反序列化將會(huì)導(dǎo)致失敗并拋出 InvalidClassException。

    如還想要更進(jìn)一步的詳細(xì)信息,可以自行查看 JDK 的 API,里面對(duì) Serializable 做了比較詳細(xì)的解釋。

    接下來做個(gè)小示例 :

     
    package net.yeah.fancydeepin.model;

    import java.io.Serializable;

    public class User implements Serializable{

        
    private static final long serialVersionUID = 1L;
        
        
    private Integer  id;
        
    private String     name;
        
        
    public User(){
            
        }
        
        
    public User (Integer id, String name){
            
    this.id   = id;
            
    this.name = name;
        }
        
        
    public Integer getId() {
            
    return id;
        }
        
        
    public String getName() {
            
    return name;
        }
        
        
    public void setId(Integer id) {
            
    this.id = id;
        }
        
        
    public void setName(String name) {
            
    this.name = name;
        }
        
    }
     


    Junit 測試 :

     
    package junit.test;

    import org.junit.Test;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import net.yeah.fancydeepin.model.User;

    public class TestApp {

        @Test
        
    public void serializable() throws Exception{
            
            User user 
    = new User(9080"fancy");
            ObjectOutputStream outStream 
    = new ObjectOutputStream(new FileOutputStream("user.ser"));
            outStream.writeObject(user);
            System.out.println(
    "<---- Finished ---->");
        }
        
        @Test
        
    public void inverseSerializable() throws Exception{
            
            ObjectInputStream inputStream 
    = new ObjectInputStream(new FileInputStream("user.ser"));
            User user 
    = (User)inputStream.readObject();
            System.out.println(
    "ID   : " + user.getId());
            System.out.println(
    "name : " + user.getName());
        }
        
    }
     

    選中 serializable 方法,右鍵,Run As Junit Test,后臺(tái)輸出 :

     
    <---- Finished ---->
     

    選中工程名,按 F5 刷新一下,在項(xiàng)目名的根目錄下就生成了一個(gè) user.ser 文件,這就是 User 對(duì)象序列化生成的文件,它記錄了 User 對(duì)象的一些狀態(tài)信息,

    當(dāng)然,你可以根據(jù)需要選擇文件的存放路徑。

    選中 inverseSerializable 方法,右鍵,Run As Junit Test,后臺(tái)輸出 :

     
    ID       : 
    9080
    name :  fancy
     


    1 . 若將 User 類中的序列化接口實(shí)現(xiàn)去掉 :

     
    package net.yeah.fancydeepin.model;

    public class User{
        
        
    private Integer id;
        
    private String  name;
        
        
    public User(){
            
        }
        
        
    public User (Integer id, String name){
            
    this.id   = id;
            
    this.name = name;
        }
        
        
    public Integer getId() {
            
    return id;
        }
        
        
    public String getName() {
            
    return name;
        }
        
        
    public void setId(Integer id) {
            
    this.id = id;
        }
        
        
    public void setName(String name) {
            
    this.name = name;
        }
        
    }
     

    其余不變,再次運(yùn)行 Junit Test 的 serializable 方法,后臺(tái)拋出異常 :

     
    java.io.NotSerializableException: net.yeah.fancydeepin.model.User
     


    2 . 先將 User 類撤銷回來 :

     
    package net.yeah.fancydeepin.model;

    import java.io.Serializable;

    public class User implements Serializable{

        
    private static final long serialVersionUID = 1L;
        
        
    private Integer id;
        
    private String  name;
        
        
    public User(){
            
        }
        
        
    public User (Integer id, String name){
            
    this.id   = id;
            
    this.name = name;
        }
        
        
    public Integer getId() {
            
    return id;
        }
        
        
    public String getName() {
            
    return name;
        }
        
        
    public void setId(Integer id) {
            
    this.id = id;
        }
        
        
    public void setName(String name) {
            
    this.name = name;
        }
        
    }
     

    其余不變,再次運(yùn)行 Junit Test 的 serializable 方法,先讓它正確序列化 User 對(duì)象生成 user.ser,接著,修改 serialVersionUID 的值 :

     
    private static final long serialVersionUID = 10086L;
     

    接著,運(yùn)行 Junit Test 的 inverseSerializable 方法,后臺(tái)拋出異常 :

     
    java.io.InvalidClassException: net.yeah.fancydeepin.model.User; local 
    class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 10086
     

    這兩個(gè)異常是為了幫助朋友們理解 Serializable,異常信息都比較容易理解和接受,這里就不多解釋了,本文也到此結(jié)束。



      
    posted on 2012-10-05 18:38 fancydeepin 閱讀(3239) 評(píng)論(3)  編輯  收藏

    評(píng)論:
    # re: implements java.io.Serializable 2012-10-08 08:32 | dohkoos
    序列化 Serializable
    反序列化 Deserialize  回復(fù)  更多評(píng)論
      
    # re: implements java.io.Serializable 2012-10-08 08:35 | dohkoos
    序列化 Serialize
    反序列化 Deserialize  回復(fù)  更多評(píng)論
      
    # re: implements java.io.Serializable 2012-10-11 15:22 | fancydeepin
    回復(fù) @dohkoos

    嗯,感謝你的來訪和評(píng)論,謝謝提醒 ^_^  回復(fù)  更多評(píng)論
      

    只有注冊用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日本免费观看网站| 亚洲色图综合在线| 免费av一区二区三区| 亚洲欧洲无卡二区视頻| 久久亚洲精品无码AV红樱桃| 亚洲综合另类小说色区| 免费又黄又硬又爽大片| 国产无遮挡裸体免费视频| 亚洲精品综合久久中文字幕| 久青草视频在线观看免费| 亚洲高清偷拍一区二区三区| 国产亚洲蜜芽精品久久| 国产禁女女网站免费看| 久久久久亚洲国产AV麻豆| 日韩精品电影一区亚洲| 产传媒61国产免费| 2022中文字字幕久亚洲| jizz在线免费观看| 久久久久亚洲精品影视| 国产精品免费网站| 亚洲免费综合色在线视频| 国产免费av片在线无码免费看| 特黄aa级毛片免费视频播放| 国产精品亚洲美女久久久| 国产成人AV片无码免费| 亚洲国产成人高清在线观看| 曰批视频免费40分钟试看天天| 亚洲视频网站在线观看| 最近免费中文字幕大全免费 | 久久青青草原亚洲av无码| 不卡视频免费在线观看| 亚洲最大黄色网站| 国产婷婷高清在线观看免费| 中文精品人人永久免费| 亚洲精品456人成在线| 2048亚洲精品国产| 中文毛片无遮挡高潮免费| 国产在亚洲线视频观看| 亚洲伊人tv综合网色| 日本不卡免费新一二三区| 女人体1963午夜免费视频|