序列化的概念和應用

序列化是指將對象轉換為可存儲或可傳輸的格式的過程。在計算機科學中,序列化常用於在進程之間傳輸數據,或將數據存儲到文件或資料庫中。

一、實體類序列化的作用

在Java中,實體類對象是存放在內存中的,而我們需要將其保存到資料庫中或進行網路傳輸時,則需要將實體類序列化為位元組流。

例如,下面是一個用戶實體類的定義:

public class User {
    private Long id;
    private String name;
    private String email;
    // 構造函數和get/set方法省略
}

將用戶實體類序列化為位元組流的示例代碼如下:

User user = new User(1L, "Alice", "alice@example.com");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(user);
byte[] bytes = bos.toByteArray();
out.close();
bos.close();

從位元組流中反序列化為實體類對象的示例代碼如下:

byte[] bytes = ...; // 從網路或文件中讀取的位元組流
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(bis);
User user = (User) in.readObject();
in.close();
bis.close();

二、序列化活動的概念

1. 序列化和反序列化過程

序列化是將對象轉換為位元組流的過程,而反序列化則是將位元組流轉換回原始對象的過程。

在Java中,序列化和反序列化可以通過實現Serializable介面來實現。例如:

public class User implements Serializable {
    ...
}

當序列化一個實現Serializable介面的對象時,Java會保存對象的類名、類結構和對象數據等信息,以便在反序列化時使用。

2. 序列化協議

序列化協議是指序列化對象時規定的位元組序、類型信息、欄位順序等規則。Java有自己的默認序列化協議,也可以使用其它協議,例如Google的Protocol Buffer。

默認情況下,Java使用的序列化協議會將對象數據編碼為位元組流,並保存對象的完整類名、欄位名稱和類型信息等。這種序列化方式會佔用大量空間,並且對於欄位名稱的修改、添加或刪除等操作會造成反序列化失敗。

因此,為了提高序列化的效率和可靠性,我們可以使用優化過的序列化協議,例如Google的Protocol Buffer或Facebook的Thrift。

3. 序列化版本號

序列化版本號是一個32位的整數,用於標識序列化對象的版本號。當對象發生變化時,我們需要更新版本號,以便反序列化時能夠識別出不同版本的對象。

在Java中,可以使用serialVersionUID屬性來表示序列化對象的版本號。例如:

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    ...
}

三、與序列化相關的其他概念

1. 反序列化漏洞

反序列化漏洞是指攻擊者利用序列化和反序列化機制的漏洞,將惡意代碼注入到反序列化的對象中,從而導致安全漏洞。這種漏洞通常會導致遠程代碼執行、拒絕服務、數據泄露等嚴重後果。

為了防止反序列化漏洞,我們需要使用白名單機制來限制反序列化的類和對象,或使用安全的序列化協議。

2. JSON序列化

JSON是一種輕量級的數據交換格式,能夠表示複雜的數據結構,並且具有良好的可讀性和易用性。在前後端數據傳輸和API調用中,JSON已經成為了一種標準的編碼方式。

在Java中,我們可以使用Jackson、Gson等庫來將Java對象序列化為JSON字元串,或將JSON字元串反序列化為Java對象。

例如,將User對象序列化為JSON字元串的示例代碼如下:

User user = new User(1L, "Alice", "alice@example.com");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);

從JSON字元串反序列化為User對象的示例代碼如下:

String json = ...; // 從前端或API獲取的JSON字元串
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);

3. XML序列化

XML是一種用於數據交換的標記語言,具有良好的可擴展性和可讀性。在Java中,我們可以使用JAXB、Xstream等庫將Java對象序列化為XML文件或字元串,或將XML字元串反序列化為Java對象。

例如,將User對象序列化為XML文件的示例代碼如下:

User user = new User(1L, "Alice", "alice@example.com");
JAXBContext context = JAXBContext.newInstance(User.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(user, new File("user.xml"));

從XML文件中反序列化為User對象的示例代碼如下:

File file = new File("user.xml"); // 從文件中讀取XML數據
JAXBContext context = JAXBContext.newInstance(User.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
User user = (User) unmarshaller.unmarshal(file);

4. 序列化框架

隨著業務系統的複雜度不斷提高,我們需要處理更加複雜的數據結構和業務邏輯。因此,序列化框架成為了一個重要的工具和組件庫。

目前流行的Java序列化框架包括Kryo、FST、Hessian、Avro等。這些框架具有高效、可擴展、易用等特點,並且可以適應不同的業務場景和性能需求。

例如,使用Kryo將User對象序列化為位元組流的示例代碼如下:

User user = new User(1L, "Alice", "alice@example.com");
Kryo kryo = new Kryo();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Output output = new Output(bos);
kryo.writeObject(output, user);
output.close();
byte[] bytes = bos.toByteArray();
bos.close();

從位元組流反序列化為User對象的示例代碼如下:

byte[] bytes = ...; // 從網路或文件中讀取的位元組流
Kryo kryo = new Kryo();
Input input = new Input(bytes);
User user = kryo.readObject(input, User.class);
input.close();

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 05:45
下一篇 2024-11-27 05:45

相關推薦

  • 金額選擇性序列化

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

    編程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • 鍵值存儲(kvs):從基礎概念到實戰應用

    本文將從基礎概念入手,介紹鍵值存儲(kvs)的概念、原理以及實戰應用,並給出代碼實現。通過閱讀本文,您將了解鍵值存儲的優缺點,如何選擇最適合的鍵值存儲方案,以及如何使用鍵值存儲解決…

    編程 2025-04-28
  • 奈奎斯特帶寬——數字信號處理中的重要概念

    一、概述 奈奎斯特帶寬是數字信號處理領域中的重要概念,它是指採樣信號中最高有效頻率的兩倍。它在數字信號處理的採樣率選擇和濾波器設計中具有重要的作用。 二、採樣定理 採樣是將模擬信號…

    編程 2025-04-25
  • Java繼承的概念

    一、繼承的基本概念 繼承是Java面向對象編程語言中最重要和最關鍵的概念之一。繼承可以被描述為一個類從其它類中獲得屬性和方法的過程,這個過程可以讓代碼更加的簡化和易於管理。繼承可以…

    編程 2025-04-24
  • SQL中FROM多個表概念詳解

    一、基本概念 在SQL語句中,FROM是一個非常重要的關鍵詞,用於指定查詢的表和關聯方式。在多個表的情況下,可以使用JOIN子句來進行表的關聯。JOIN子句指定了如何將多個表連接起…

    編程 2025-04-23
  • Java Json序列化詳解

    一、Json 簡介 JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。它基於ECMAScript的一個子集,採用完全獨立於編程語言的文本格…

    編程 2025-04-12
  • 操作系統的概念

    一、操作系統的定義 操作系統,簡稱OS,也稱作系統軟體,是一類控制計算機硬體和軟體資源的程序集合,它管理和調配計算機系統的各種資源,為用戶和其他軟體提供良好的運行環境和介面。 在計…

    編程 2025-04-02
  • 如何理解trimmedmean的概念與應用

    一、trimmedmean的定義與概念 trimmedmean,也稱作截尾均值,是在計算數據集平均值時去掉極端值後所計算出的均值。其具體實現是將數據集中最高與最低的一定百分比去除,…

    編程 2025-04-02
  • Java序列化和反序列化

    一、簡介 Java序列化是將對象轉換為位元組序列的過程,以便在網路上傳輸或保存到文件中。反序列化是將位元組序列轉換回對象的過程。它們是Java中非常重要的特性,可以幫助我們方便地將對象…

    編程 2025-03-12

發表回復

登錄後才能評論