自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

招行二面:為什么需要序列化和反序列?為什么不能直接使用對象?

開發(fā) 前端
本文我們深入淺出地探討了Java中的序列化和反序列化,從基本概念到原理分析,再到實際的代碼示例,希望你對這兩個重要的技術點有了更清晰的理解。

工作中,我們經常聽到序列化和反序列化,那么,什么是序列化?什么又是反序列化?這篇文章,我們來分析一個招商的面試題:為什么需要序列化和反序列化?

一、什么是序列化和反序列化?

簡單來說,序列化就是把一個Java對象轉換成一系列字節(jié)的過程,這些字節(jié)可以被存儲到文件、數據庫,或者通過網絡傳輸。反過來,反序列化則是把這些字節(jié)重新轉換成Java對象的過程。

想象一下,你有一個手機應用中的用戶對象(比如用戶的名字、年齡等信息)。如果你想將這個用戶對象存儲起來,或者發(fā)送給服務器,你就需要先序列化它。等到需要使用的時候,再通過反序列化把它恢復成原來的對象。

二、為什么需要序列化?

“為什么需要序列化?為什么不能直接使用對象呢?”這確實是一個好問題,而且很多工作多年的程序員不一定能回答清楚。綜合來看:需要序列化的主要原因有以下三點:

  • 持久化存儲:當你需要將對象的數據保存到磁盤或數據庫中時,必須把對象轉換成一系列字節(jié)。
  • 網絡傳輸:在分布式系統(tǒng)中,不同的機器需要交換對象數據,序列化是實現這一點的關鍵。
  • 深拷貝:有時候需要創(chuàng)建對象的副本,序列化和反序列化可以幫助你實現深拷貝。

更直白的說,序列化是為了實現持久化和網絡傳輸,對象是應用層的東西,不同的語言(比如:java,go,python)創(chuàng)建的對象還不一樣,實現持久化和網絡傳輸的載體不認這些對象。

三、序列化的原理分析

Java中的序列化是通過實現java.io.Serializable接口來實現的。這個接口是一個標記接口,意味著它本身沒有任何方法,只是用來標記這個類的對象是可序列化的。

當你序列化一個對象時,Java會將對象的所有非瞬態(tài)(transient)和非靜態(tài)字段的值轉換成字節(jié)流。這包括對象的基本數據類型、引用類型,甚至是繼承自父類的字段。

序列化的步驟:

  • 實現Serializable接口:你的類需要實現這個接口。
  • **創(chuàng)建ObjectOutputStream**:用于將對象轉換成字節(jié)流。
  • 調用writeObject方法:將對象寫入輸出流。
  • 關閉流:別忘了關閉流以釋放資源。

反序列化的步驟大致相同,只不過是使用ObjectInputStream和readObject方法。

四、示例演示

讓我們通過一個簡單的例子來看看實際操作是怎樣的。

1. 定義一個可序列化的類

import java.io.Serializable;

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

    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 + "'}";
    }
}

2. 序列化對象

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("對象已序列化到 user.ser 文件中.");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

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

3. 反序列化對象

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("反序列化后的對象: " + user);
        } catch (IOException | ClassNotFoundException i) {
            i.printStackTrace();
        }
    }
}

運行這段代碼,你會看到輸出:

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

注意到password字段為空,這是因為它被聲明為transient,在序列化過程中被忽略了。

五、常見問題與注意事項

1. serialVersionUID是干嘛的?

serialVersionUID是序列化時用來驗證版本兼容性的一個標識符。如果你不顯式定義它,Java會根據類的結構自動生成。但為了避免類結構變化導致序列化失敗,建議手動定義一個固定的值。

2. 繼承關系中的序列化

如果一個類的父類沒有實現Serializable接口,那么在序列化子類對象時,父類的字段不會被序列化。反序列化時,父類的構造函數會被調用初始化父類部分。

3. 處理敏感信息

使用transient關鍵字可以防止敏感信息被序列化,比如密碼字段。此外,你也可以自定義序列化邏輯,通過實現writeObject和readObject方法來更精細地控制序列化過程。

六、總結

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

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

最直白的說,如果不進行持久化和網絡傳輸,根本不需要序列化和反序列化。如果需要實現持久化和網絡傳輸,就必須序列化和反序列化,因為對象是應用層的東西,不同的語言(比如:java,go,python)創(chuàng)建的對象還不一樣,實現持久化和網絡傳輸的載體根本不認這些對象。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2011-06-01 15:18:43

Serializabl

2011-06-01 15:05:02

序列化反序列化

2024-09-03 08:17:59

2009-06-14 22:01:27

Java對象序列化反序列化

2025-04-14 10:00:00

負載均衡Java開發(fā)

2018-03-19 10:20:23

Java序列化反序列化

2009-08-24 17:14:08

C#序列化

2011-05-18 15:20:13

XML

2022-08-06 08:41:18

序列化反序列化Hessian

2009-09-09 14:45:41

XML序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2020-12-24 18:46:11

Java序列化編程語言

2009-08-06 11:16:25

C#序列化和反序列化

2023-12-26 07:26:07

Java序列化反序列化機制

2012-04-13 10:45:59

XML

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2021-11-18 07:39:41

Json 序列化Vue

2009-09-09 16:10:11

.NET序列化和反序列

2009-08-25 14:43:26

C#序列化和反序列化
點贊
收藏

51CTO技術棧公眾號