Java序列化及反序列化

介紹

Java序列化及反序列化是Java編程中經常用到的技術,它們允許對象以位元組流的形式在網路上傳輸或持久化到磁碟。正是由於Java序列化能夠將對象轉換成磁碟上或網路上傳輸的位元組流,使我們可以輕鬆地進行深度克隆、對象傳輸和數據交換等操作。

Java對象序列化機制是將對象的狀態信息轉換為可以存儲在磁碟文件或在網路中傳輸的位元組序列的過程。

序列化

Java對象序列化是Java API中提供的一種機制,依據該機制可以將任何實現了Serializable介面的Java對象轉換為位元組流表示,然後可以將位元組流表示的對象保存到磁碟中,或通過網路傳輸到遠程系統。

實現

實現Java對象序列化僅需以下簡單步驟:

  1. 創建實現序列化介面Serializable的類。
  2. 實例化該類的對象。
  3. 創建ObjectOutputStream對象。該對象用於將將對象寫入流中。
  4. 調用ObjectOutputStream.writeObject()方法,將對象寫入流中。
  5. 流刷新並關閉。
//創建一個User對象
public class User implements Serializable {
    private String username;
    private String password;
    private int age;

    //獲取username、password、age等屬性的getters和setters方法省略

    //toString方法
    public String toString() {
        return "username=" + username + ";password=" + password + ";age=" + age;
    }
}

//serializing代碼
public class SerializingObject {
    public static void main(String[] args) {
        User user = new User("Tom", "123456", 18);
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("user.txt"));
            oos.writeObject(user);
            System.out.println("User對象序列化成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

反序列化

反序列化是將位元組數組還原成Java對象的過程。Java提供了一個ObjectInputStream類用於從流中反序列化對象。

實現

實現Java對象反序列化也很簡單,僅需以下幾個步驟:

  1. 創建ObjectInputStream對象,該對象用於從流中讀取對象。
  2. 調用ObjectInputStream.readObject()方法,將對象還原成Java對象。
public class DeSerializingObject {
    public static void main(String[] args) {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("user.txt"));
            User user = (User) ois.readObject();
            System.out.println("User對象反序列化成功!對象信息如下:");
            System.out.println(user.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

要點

不適用於所有對象

Java序列化機制無法序列化static和transient修飾的成員變數,因為static修飾的成員變數不屬於對象的狀態,而transient修飾的成員變數代表不希望被序列化持久化。若序列化對象中帶有以上修飾符修飾的成員變數,需要注意這些變數的序列化和反序列化使用。

版本控制

對象的版本控制對序列化和反序列化具有重要影響。當一個對象被序列化後被修改,反序列化可能會失敗,因為反序列化時默認比較對象的serialVersionUID是否一致。若不一致,則反序列化失敗無法還原Java對象。因此,在對優先序列化的對象進行版本控制時,需要指定serialVersionUID來保證版本的一致。

public class User implements Serializable {
    private static final long serialVersionUID = 143857367482L;
    //其他代碼省略
}

安全問題

由於可以通過Java序列化機制將對象序列化成二進位碼,因此Java序列化機制可能會帶來安全問題。惡意攻擊者可以序列化惡意對象並發送給接收者從而導致安全問題。針對該問題,可以使用Java對象序列化框架,如Hessian、Kryo等,去解決Java序列化安全問題。

總結

Java序列化及反序列化可將Java對象序列化成位元組流從而便於傳輸、存儲和分發。其序列化和反序列化過程非常簡單,但需要注意一些使用小細節和實際安全問題。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249110.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:31
下一篇 2024-12-12 13:31

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論