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

一文帶你解讀Java序列化和反序列化機制

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

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

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

整個過程都是 Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象。

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

簡單來說:

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

下面是序列化和反序列化常見應用場景:

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

需要讓某個對象支持序列化機制,需要保證該類是可序列化的:

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

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

序列化演示:

Dog類:

// Dog類需要實現(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進行序列化
 */
@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("旺財",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文件
    // 注意:讀取順序要和序列化時的順序一致!
    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();
}

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

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

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

序列化對象時,static和transient修飾的成員不會被序列化

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

相關(guān)文章

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

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

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

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

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

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

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

    mybatis 忽略實體對象的某個屬性(2種方式)

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

    Java基礎(chǔ)教程之數(shù)組的定義與使用

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

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

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

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

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

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

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

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

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

    精通Java接口的使用與原理

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

最新評論

吉水县| 于都县| 丁青县| 徐汇区| 平远县| 繁峙县| 长阳| 和林格尔县| 册亨县| 达孜县| 蒲江县| 遂昌县| 聂荣县| 平原县| 通城县| 兴化市| 宾川县| 顺昌县| 无极县| 抚宁县| 荣昌县| 虹口区| 四川省| 称多县| 广水市| 犍为县| 泽库县| 清水河县| 得荣县| 龙胜| 萝北县| 郁南县| 东乌珠穆沁旗| 贵南县| 奇台县| 泰来县| 内乡县| 裕民县| 察隅县| 勐海县| 陆丰市|