日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

為什么需要序列化和反序列?為什么不能直接使用對(duì)象?

admin
2025年5月3日 18:43 本文熱度 307

工作中,我們經(jīng)常聽(tīng)到序列化反序列化,那么,什么是序列化?什么又是反序列化?這篇文章,我們來(lái)分析一個(gè)招商的面試題:為什么需要序列化反序列化?

1. 什么是序列化和反序列化?

簡(jiǎn)單來(lái)說(shuō),序列化就是把一個(gè)Java對(duì)象轉(zhuǎn)換成一系列字節(jié)的過(guò)程,這些字節(jié)可以被存儲(chǔ)到文件、數(shù)據(jù)庫(kù),或者通過(guò)網(wǎng)絡(luò)傳輸。反過(guò)來(lái),反序列化則是把這些字節(jié)重新轉(zhuǎn)換成Java對(duì)象的過(guò)程。

想象一下,你有一個(gè)手機(jī)應(yīng)用中的用戶對(duì)象(比如用戶的名字、年齡等信息)。如果你想將這個(gè)用戶對(duì)象存儲(chǔ)起來(lái),或者發(fā)送給服務(wù)器,你就需要先序列化它。等到需要使用的時(shí)候,再通過(guò)反序列化把它恢復(fù)成原來(lái)的對(duì)象。

?

2. 為什么需要序列化?

“為什么需要序列化?為什么不能直接使用對(duì)象呢?”這確實(shí)是一個(gè)好問(wèn)題,而且很多工作多年的程序員不一定能回答清楚。綜合來(lái)看:需要序列化的主要原因有以下三點(diǎn):

  1. 持久化存儲(chǔ):當(dāng)你需要將對(duì)象的數(shù)據(jù)保存到磁盤(pán)或數(shù)據(jù)庫(kù)中時(shí),必須把對(duì)象轉(zhuǎn)換成一系列字節(jié)。
  2. 網(wǎng)絡(luò)傳輸:在分布式系統(tǒng)中,不同的機(jī)器需要交換對(duì)象數(shù)據(jù),序列化是實(shí)現(xiàn)這一點(diǎn)的關(guān)鍵。
  3. 深拷貝:有時(shí)候需要?jiǎng)?chuàng)建對(duì)象的副本,序列化和反序列化可以幫助你實(shí)現(xiàn)深拷貝。

更直白的說(shuō),序列化是為了實(shí)現(xiàn)持久化和網(wǎng)絡(luò)傳輸,對(duì)象是應(yīng)用層的東西,不同的語(yǔ)言(比如:java,go,python)創(chuàng)建的對(duì)象還不一樣,實(shí)現(xiàn)持久化和網(wǎng)絡(luò)傳輸?shù)妮d體不認(rèn)這些對(duì)象。

3. 序列化的原理分析

Java中的序列化是通過(guò)實(shí)現(xiàn)java.io.Serializable接口來(lái)實(shí)現(xiàn)的。這個(gè)接口是一個(gè)標(biāo)記接口,意味著它本身沒(méi)有任何方法,只是用來(lái)標(biāo)記這個(gè)類的對(duì)象是可序列化的。

當(dāng)你序列化一個(gè)對(duì)象時(shí),Java會(huì)將對(duì)象的所有非瞬態(tài)(transient)和非靜態(tài)字段的值轉(zhuǎn)換成字節(jié)流。這包括對(duì)象的基本數(shù)據(jù)類型、引用類型,甚至是繼承自父類的字段。

序列化的步驟

  1. 實(shí)現(xiàn)Serializable接口:你的類需要實(shí)現(xiàn)這個(gè)接口。
  2. **創(chuàng)建ObjectOutputStream**:用于將對(duì)象轉(zhuǎn)換成字節(jié)流。
  3. 調(diào)用writeObject方法:將對(duì)象寫(xiě)入輸出流。
  4. 關(guān)閉流:別忘了關(guān)閉流以釋放資源。

反序列化的步驟大致相同,只不過(guò)是使用ObjectInputStreamreadObject方法。

4. 示例演示

讓我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看實(shí)際操作是怎樣的。

定義一個(gè)可序列化的類

import java.io.Serializable;

publicclass User implements Serializable {
    privatestaticfinallong serialVersionUID = 1L// 推薦定義序列化版本號(hào)
    private String name;
    privateint age;
    privatetransient String password; // transient字段不會(huì)被序列化

    public User(String name, int age, String password) {
        this.name = name;
        this.age = age;
        this.password = password;
    }

    // 省略getter和setter方法

    @Override
    public String toString() {
        return"User{name='" + name + "', age=" + age + ", password='" + password + "'}";
    }
}

序列化對(duì)象

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

publicclass SerializeDemo {
    public static void main(String[] args) {
        User user = new User("Alice"30"secret123");

        try (FileOutputStream fileOut = new FileOutputStream("user.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
             
            out.writeObject(user);
            System.out.println("對(duì)象已序列化到 user.ser 文件中.");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

運(yùn)行上述代碼后,你會(huì)發(fā)現(xiàn)當(dāng)前目錄下生成了一個(gè)名為user.ser的文件,這就是序列化后的字節(jié)流。

反序列化對(duì)象

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

publicclass DeserializeDemo {
    public static void main(String[] args) {
        User user = null;

        try (FileInputStream fileIn = new FileInputStream("user.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
             
            user = (User) in.readObject();
            System.out.println("反序列化后的對(duì)象: " + user);
        } catch (IOException | ClassNotFoundException i) {
            i.printStackTrace();
        }
    }
}

運(yùn)行這段代碼,你會(huì)看到輸出:

反序列化后的對(duì)象: User{name='Alice', age=30, password='null'}

注意到password字段為空,這是因?yàn)樗宦暶鳛?/span>transient,在序列化過(guò)程中被忽略了。

5. 常見(jiàn)問(wèn)題與注意事項(xiàng)

serialVersionUID是干嘛的?

serialVersionUID是序列化時(shí)用來(lái)驗(yàn)證版本兼容性的一個(gè)標(biāo)識(shí)符。如果你不顯式定義它,Java會(huì)根據(jù)類的結(jié)構(gòu)自動(dòng)生成。但為了避免類結(jié)構(gòu)變化導(dǎo)致序列化失敗,建議手動(dòng)定義一個(gè)固定的值。

繼承關(guān)系中的序列化

如果一個(gè)類的父類沒(méi)有實(shí)現(xiàn)Serializable接口,那么在序列化子類對(duì)象時(shí),父類的字段不會(huì)被序列化。反序列化時(shí),父類的構(gòu)造函數(shù)會(huì)被調(diào)用初始化父類部分。

處理敏感信息

使用transient關(guān)鍵字可以防止敏感信息被序列化,比如密碼字段。此外,你也可以自定義序列化邏輯,通過(guò)實(shí)現(xiàn)writeObjectreadObject方法來(lái)更精細(xì)地控制序列化過(guò)程。

6. 總結(jié)

本文,我們深入淺出地探討了Java中的序列化和反序列化,從基本概念到原理分析,再到實(shí)際的代碼示例,希望你對(duì)這兩個(gè)重要的技術(shù)點(diǎn)有了更清晰的理解。

為什么需要序列化和反序列化?

最直白的說(shuō),如果不進(jìn)行持久化和網(wǎng)絡(luò)傳輸,根本不需要序列化和反序列化。如果需要實(shí)現(xiàn)持久化和網(wǎng)絡(luò)傳輸,就必須序列化和反序列化,因?yàn)閷?duì)象是應(yīng)用層的東西,不同的語(yǔ)言(比如:java,go,python)創(chuàng)建的對(duì)象還不一樣,實(shí)現(xiàn)持久化和網(wǎng)絡(luò)傳輸?shù)妮d體根本不認(rèn)這些對(duì)象。


閱讀原文:原文鏈接


該文章在 2025/5/6 12:12:09 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 最新免费电影 | 香蕉伊蕉伊中文在线视频 | 亚洲欧美日韩综合第一页 | 伊人成年网站综合网 | 亚洲精品国偷拍自产 | 亚洲一区欧美二区 | 国产日韩欧美一区二区三区在线 | 亚洲步兵在线播放 | 国产欧美日韩精品综合在线 | 国产手机精品自拍视频 | 国产综合成人一区二区三区电影院 | 日本中文字幕一区二区有码在线 | 亚洲欧美洲成人一区二区 | 无人区一码二码三码区别 | 国产色综合久 | 欧美疯狂party | 日日夜人人澡人人澡人人看免 | 国内精品国内精品自线一二三 | 国产乱码精品一区二区三区百度 | 无人视频免费观看免费视频 | 婷婷综合缴情亚洲狠狠尤物 | 午夜免费福利在 | a视频乱| 国产高清无密码一区二区三区 | 91精品福利在线观看播放 | 日韩精品一区二区三区免费在线 | 欧美在线视频一区 | 激情国产精品一区二区 | 五月天亚洲欧美激 | 亚洲高清中文 | 亚洲精品视频在线播放 | 日本黄页网址在线 | 在线不卡高 | 漂亮的保姆6 | h版电影在线播放视频网址 99九九精品国产高清自在线 | 最新高清电影免费在线观看下载 | 香蕉影视 | 99亚洲直播在 | 亚洲卡一| 欧美性性性 | 太粗太硬小寡妇受不了 |