最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你解讀Java序列化和反序列化機(jī)制

 更新時(shí)間:2023年01月11日 09:38:33   作者:世界盡頭與你  
序列化是將對(duì)象轉(zhuǎn)換成二進(jìn)制字節(jié)流的過程;反序列化是從二進(jìn)制字節(jié)流中恢復(fù)對(duì)象的過程。本文將大家詳細(xì)講講二者的原理與實(shí)現(xiàn),希望對(duì)大家有所幫助

Java 提供了一種對(duì)象序列化的機(jī)制,該機(jī)制中,一個(gè)對(duì)象可以被表示為一個(gè)字節(jié)序列,該字節(jié)序列包括該對(duì)象的數(shù)據(jù)、有關(guān)對(duì)象的類型的信息和存儲(chǔ)在對(duì)象中數(shù)據(jù)的類型。

將序列化對(duì)象寫入文件之后,可以從文件中讀取出來,并且對(duì)它進(jìn)行反序列化,也就是說,對(duì)象的類型信息、對(duì)象的數(shù)據(jù),還有對(duì)象中的數(shù)據(jù)類型可以用來在內(nèi)存中新建對(duì)象。

整個(gè)過程都是 Java 虛擬機(jī)(JVM)獨(dú)立的,也就是說,在一個(gè)平臺(tái)上序列化的對(duì)象可以在另一個(gè)完全不同的平臺(tái)上反序列化該對(duì)象。

類 ObjectInputStream 和 ObjectOutputStream 是高層次的數(shù)據(jù)流,它們包含反序列化和序列化對(duì)象的方法。

簡單來說:

  • 序列化: 將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換成二進(jìn)制字節(jié)流的過程
  • 反序列化:將在序列化過程中所生成的二進(jìn)制字節(jié)流轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu)或者對(duì)象的過程

下面是序列化和反序列化常見應(yīng)用場(chǎng)景:

  • 對(duì)象在進(jìn)行網(wǎng)絡(luò)傳輸(比如遠(yuǎn)程方法調(diào)用 RPC 的時(shí)候)之前需要先被序列化,接收到序列化的對(duì)象之后需要再進(jìn)行反序列化;
  • 將對(duì)象存儲(chǔ)到文件之前需要進(jìn)行序列化,將對(duì)象從文件中讀取出來需要進(jìn)行反序列化;
  • 將對(duì)象存儲(chǔ)到數(shù)據(jù)庫(如 Redis)之前需要用到序列化,將對(duì)象從緩存數(shù)據(jù)庫中讀取出來需要反序列化;
  • 將對(duì)象存儲(chǔ)到內(nèi)存之前需要進(jìn)行序列化,從內(nèi)存中讀取出來之后需要進(jìn)行反序列化。

需要讓某個(gè)對(duì)象支持序列化機(jī)制,需要保證該類是可序列化的:

該類必須實(shí)現(xiàn)以下兩個(gè)接口之一:

  • Serializable(優(yōu)先選擇)
  • Externalizable

序列化演示:

Dog類:

// Dog類需要實(shí)現(xiàn)Serializable接口才可以支持序列化操作
class Dog implements Serializable {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
/**
 * ObjectOutputStream進(jìn)行序列化
 */
@Test
public void Out() throws IOException {
    String filePath = "D:\\data.dat";
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
    oos.write(100);
    oos.writeBoolean(true);
    oos.writeChar('a');
    oos.writeDouble(5.21);
    oos.writeUTF("IMUSTCTF");
    oos.writeObject(new Dog("旺財(cái)",1));
    oos.close();
    System.out.println("數(shù)據(jù)序列化成功!");
}

反序列化演示:

反序列化類:

/**
 * ObjectInputStream反序列化
 */
@Test
public void Input() throws IOException, ClassNotFoundException {
    String filePath = "D:\\data.dat";
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
    // 開始讀取bat文件
    // 注意:讀取順序要和序列化時(shí)的順序一致!
    System.out.println(ois.readInt());
    System.out.println(ois.readBoolean());
    System.out.println(ois.readChar());
    System.out.println(ois.readDouble());
    System.out.println(ois.readUTF());
    Object dog = ois.readObject();
    System.out.println(dog);
    // 訪問dog的私有屬性
    Dog dd = (Dog) dog;
    System.out.println(dd.getName());
    // 關(guān)閉外層流
    ois.close();
}

對(duì)象處理流使用細(xì)節(jié):

  • 請(qǐng)按照序列化的順序進(jìn)行反序列化
  • 序列化的類中建議添加如下語句:(為了提高版本的兼容性)
@Serial
private static final long serialVersionUID = 1L;

序列化具有可繼承性,父類實(shí)現(xiàn)了序列化,則其子類也會(huì)默認(rèn)實(shí)現(xiàn)序列化

序列化對(duì)象時(shí),static和transient修飾的成員不會(huì)被序列化

到此這篇關(guān)于一文帶你解讀Java序列化和反序列化機(jī)制的文章就介紹到這了,更多相關(guān)Java序列化 反序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot+vue實(shí)現(xiàn)七牛云頭像的上傳

    springboot+vue實(shí)現(xiàn)七牛云頭像的上傳

    本文將介紹如何在Spring Boot項(xiàng)目中利用七牛云進(jìn)行圖片上傳并將圖片存儲(chǔ)在云存儲(chǔ)中,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁并帶條件模糊查詢功能

    springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁并帶條件模糊查詢功能

    這篇文章主要介紹了springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁并帶條件模糊查詢功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Java 信息摘要加密MD2、MD4、MD5實(shí)現(xiàn)詳解

    Java 信息摘要加密MD2、MD4、MD5實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java 信息摘要加密MD2、MD4、MD5實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • mybatis 忽略實(shí)體對(duì)象的某個(gè)屬性(2種方式)

    mybatis 忽略實(shí)體對(duì)象的某個(gè)屬性(2種方式)

    這篇文章主要介紹了mybatis 忽略實(shí)體對(duì)象的某個(gè)屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java基礎(chǔ)教程之?dāng)?shù)組的定義與使用

    Java基礎(chǔ)教程之?dāng)?shù)組的定義與使用

    Java語言的數(shù)組是一個(gè)由固定長度的特定類型元素組成的集合,它們的數(shù)據(jù)類型必須相同,聲明變量的時(shí)候,必須要指定參數(shù)類型,這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之?dāng)?shù)組的定義與使用的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • JavaCV調(diào)用百度AI實(shí)現(xiàn)人臉檢測(cè)方法詳解

    JavaCV調(diào)用百度AI實(shí)現(xiàn)人臉檢測(cè)方法詳解

    在檢測(cè)人臉數(shù)量、位置、性別、口罩等場(chǎng)景時(shí),可以考慮使用百度開放平臺(tái)提供的web接口,一個(gè)web請(qǐng)求就能完成檢測(cè)得到結(jié)果。本文就為大家介紹JavaCV如何調(diào)用百度AI實(shí)現(xiàn)最簡單的人臉檢測(cè),需要的可以參考一下
    2022-01-01
  • Jenkins配置前端自動(dòng)打包部署全過程(若依項(xiàng)目)

    Jenkins配置前端自動(dòng)打包部署全過程(若依項(xiàng)目)

    Jenkins作為一個(gè)開源的自動(dòng)化服務(wù)器,廣泛用于持續(xù)集成、持續(xù)部署(CI/CD)流程中,這篇文章主要給大家介紹了關(guān)于Jenkins配置前端自動(dòng)打包部署(若依項(xiàng)目)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • java調(diào)用未知類的指定方法簡單實(shí)例

    java調(diào)用未知類的指定方法簡單實(shí)例

    這篇文章介紹了java調(diào)用未知類的指定方法簡單實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • spring中使用Mockito解決Bean依賴樹問題方法

    spring中使用Mockito解決Bean依賴樹問題方法

    在本篇文章里小編給各位整理了關(guān)于spring中使用Mockito解決Bean依賴樹問題方法,有需要的朋友們可以參考下。
    2020-01-01
  • 精通Java接口的使用與原理

    精通Java接口的使用與原理

    接口,在JAVA編程語言中是一個(gè)抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法
    2022-03-03

最新評(píng)論

崇明县| 马鞍山市| 南充市| 南华县| 阿勒泰市| 拉孜县| 满洲里市| 西乌珠穆沁旗| 股票| 凤城市| 金坛市| 盐城市| 禄丰县| 惠东县| 自贡市| 合水县| 股票| 沐川县| 逊克县| 北京市| 沙坪坝区| 东乡县| 五大连池市| 平泉县| 汶川县| 二手房| 新干县| 察雅县| 保定市| 乡城县| 清河县| 龙游县| 错那县| 民和| 孝义市| 昌乐县| 阳春市| 黑山县| 东丰县| 临邑县| 商城县|