java反序列化

折翼的小鸟先生發表於2024-04-30

java反序列化

前言之前我們大致學習了php反序列化的內容,本節我們來了解一下java反序列化

1.1 java反序列化基礎

1 功能特性:不像php反序列化中將物件轉換為字串,在java中,物件序列化後的結果是位元組流。在java中反序

列化操作一般應用在匯入模板檔案,網路通訊,資料傳輸,日誌格式化儲存等操作。

2 資料特性:一段資料要是以rO0AB 開頭,那麼基本可以確定這是java序列化base64加密的資料,如果是以aced

開頭,那麼他就是一段java序列化的16進位制

3 反序列化判斷:

可以透過檢視java中是否引用Serializable介面來判斷是否進行序列化,我們來檢視一個序列化的具體例子:

import java.io.*;

class Name implements Serializable { // 實現Serializable介面
    private static final long serialVersionUID = 1L; // 新增serialVersionUID
    public String name;
    public int age;

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

public class Hello {
    public static void main(String[] args) {
        var man = new Name("jack", 20);

        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("D:\\java\\com.Hello\\Hello\\src\\person.txt"))) { // 使用try-with-resources自動關閉流
            oos.writeObject(man);
        } catch (IOException e) { // 處理IOException
            e.printStackTrace();
            System.out.println("An error occurred while writing to the file.");
        }
    }
}

需要注意的是,開啟輸出流操作需要做異常處理

oos.writeObject(man);將物件序列化後以位元組碼的形式儲存在檔案中

我們將寫入資料後的檔案用可以檢視十六進位制資料的軟體開啟,可以發現在十六進位制資料的頭部有著aced,這說

明這是一段java序列化後的16進位制資料

相關文章