Java 序列化和反序列化

Java提供了一種對(duì)象序列化的機(jī)制,該機(jī)制中,一個(gè)對(duì)象可以被表示為一個(gè)字節(jié)序列讳苦,該字節(jié)序列包括該對(duì)象的數(shù)據(jù)、有關(guān)對(duì)象的類型的信息和存儲(chǔ)在對(duì)象中的數(shù)據(jù)類型吩谦。
將序列化對(duì)象寫入文件之后鸳谜,可以從文件中讀取出來(lái),并且對(duì)它進(jìn)行反序列化式廷,也就是說(shuō)咐扭,對(duì)象的類型信息、對(duì)象的數(shù)據(jù)滑废,還有對(duì)象中的數(shù)據(jù)類型可以用來(lái)在內(nèi)存中新建對(duì)象蝗肪。
整個(gè)過(guò)程都是Java虛擬機(jī)(JVM)獨(dú)立的,也就是說(shuō)蠕趁,在一個(gè)平臺(tái)上序列化的對(duì)象可以在另一個(gè)完全不同的平臺(tái)上反序列化該對(duì)象薛闪。
類ObjectInputStream和ObjectOutputStream是高層次的數(shù)據(jù)流,他們包含反序列化和序列化對(duì)象的方法俺陋。

注意事項(xiàng)

  • 如果一個(gè)類創(chuàng)建的對(duì)象豁延,需要被序列化,那么該類必須實(shí)現(xiàn)接口Serializable腊状,該接口沒有任何定義诱咏,是為了告訴JVM(虛擬機(jī))該類對(duì)象可以被序列化。
  • serialVersionUID號(hào)是根據(jù)類的特征和類的簽名算出來(lái)的缴挖。如果可序列化類未顯式聲明 serialVersionUID袋狞,則序列化運(yùn)行時(shí)將基于該類的各個(gè)方面計(jì)算該類的默認(rèn) serialVersionUID 值。原因是計(jì)算默認(rèn)的 serialVersionUID 對(duì)類的詳細(xì)信息具有較高的敏感性,根據(jù)編譯器實(shí)現(xiàn)的不同可能千差萬(wàn)別硕并,這樣在反序列化過(guò)程中可能會(huì)導(dǎo)致意外的 InvalidClassException法焰。
  • 被 static 修飾的成員變量無(wú)法序列化,無(wú)法寫到文件倔毙。
  • 如果不希望某個(gè)成員變量寫到文件埃仪,同時(shí)又不希望使用 static 關(guān)鍵字, 那么可以使用 transient陕赃。transient 關(guān)鍵字表示瞬態(tài)卵蛉,被 transient 修飾的成員變量無(wú)法被序列化。
準(zhǔn)備工作
  • 創(chuàng)建一個(gè)可序列化對(duì)象
    import java.io.Serializable;
    
    public class Employee implements Serializable {
        /**
         * 類的唯一標(biāo)識(shí)么库,是根據(jù)類的特征和類的簽名算出來(lái)的傻丝。
         */
        private static final long serialVersionUID = -7107394583876641565L;
        private String name;
        private String address;
        private transient int sSN;//該成員變量不需要序列化
        private int number;
        public Employee(String name, String address, int sSN, int number) {
            super();
            this.name = name;
            this.address = address;
            this.sSN = sSN;
            this.number = number;
        }
        @Override
        public String toString() {
            return "Employee [name=" + name + ", address=" + address + ", sSN=" + sSN + ", number=" + number + "]";
        }
    }
    
  • 創(chuàng)建存儲(chǔ)序列化對(duì)象的本地文件
    // 獲取系統(tǒng)默認(rèn)分隔符
    final String separator = File.separator;
    // 獲取系統(tǒng)的主目錄
    final String userHomeS = System.getProperty("user.home");
    // 序列化對(duì)象的保存路勁
    final String objectFilePathS = userHomeS + separator + "Desktop" + separator + "test" + separator + "Employee.ser";
    //創(chuàng)建該序列化對(duì)象的文件
    File file = new File(objectFilePathS);
    if (!file.exists()) {//判斷文件是否存在
      if (!file.isDirectory()) {//判斷是否是目錄文件
        //不是目錄文件,則獲取該文件的父目錄文件诉儒,并創(chuàng)建所有目錄文件
        file.getParentFile().mkdirs();
      }
    }
    

序列化

try (
  // 初始化文件輸出流
  FileOutputStream fileOutput = new FileOutputStream(objectFilePathS);
  // 初始化對(duì)象輸出流
  ObjectOutputStream ooStream = new ObjectOutputStream(fileOutput))
{
  //初始化要序列化的對(duì)象
  Employee employee = new Employee("王二", "南京", 4545565, 1010);
  ooStream.writeObject(employee);
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

反序列化

try (
  //初始化文件輸入流
  FileInputStream fileInputStream = new FileInputStream(file);
  //初始化對(duì)象輸入流
  ObjectInputStream oInputStream = new ObjectInputStream(fileInputStream))
{
  //讀取Employee對(duì)象
  Employee employee = (Employee)oInputStream.readObject();
  System.out.println(employee);
} catch (IOException | ClassNotFoundException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載葡缰,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末忱反,一起剝皮案震驚了整個(gè)濱河市泛释,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌温算,老刑警劉巖怜校,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異注竿,居然都是意外死亡茄茁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門巩割,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裙顽,“玉大人,你說(shuō)我怎么就攤上這事宣谈∮蹋” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蒲祈,是天一觀的道長(zhǎng)甘萧。 經(jīng)常有香客問我萝嘁,道長(zhǎng)梆掸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任牙言,我火速辦了婚禮酸钦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咱枉。我一直安慰自己卑硫,他們只是感情好徒恋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欢伏,像睡著了一般入挣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硝拧,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天径筏,我揣著相機(jī)與錄音,去河邊找鬼障陶。 笑死滋恬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抱究。 我是一名探鬼主播恢氯,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鼓寺!你這毒婦竟也來(lái)了勋拟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侄刽,失蹤者是張志新(化名)和其女友劉穎指黎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體州丹,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋安,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墓毒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓揪。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖所计,靈堂內(nèi)的尸體忽然破棺而出柠辞,到底是詐尸還是另有隱情,我是刑警寧澤主胧,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布叭首,位于F島的核電站,受9級(jí)特大地震影響踪栋,放射性物質(zhì)發(fā)生泄漏焙格。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一夷都、第九天 我趴在偏房一處隱蔽的房頂上張望眷唉。 院中可真熱鬧,春花似錦、人聲如沸冬阳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肝陪。三九已至驳庭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氯窍,已是汗流浹背嚷掠。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荞驴,地道東北人不皆。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熊楼,于是被迫代替她去往敵國(guó)和親霹娄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345