首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 對象序列化與反序列化實戰:ObjectOutputStream / ObjectInputStream 詳解

     編輯:Java 綜合教學

核心概念

  • ObjectOutputStream:對象輸出流,將對象寫入磁盤/網絡,實現持久化
  • ObjectInputStream:對象輸入流,從磁盤/網絡讀取對象並還原
  • 前提:被序列化的類必須實現 java.io.Serializable 標記介面

完整代碼範例

import java.io.*;

class Student implements Serializable {
    private static final long serialVersionUID = 1L; // 版本鎖,防止字段變更導致反序列化失敗
    int id;
    String name;
    transient String sex;  // transient 字段不參與序列化
    transient int age;

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

public class ObjectIODemo {
    private static final String FILE_PATH = "C:\\Users\\bigerf\\Desktop\\objTest.txt";

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        writeObject();
        readObject();
    }

    // 序列化寫入
    public static void writeObject() throws IOException {
        File file = new File(FILE_PATH);
        try (FileOutputStream fos = new FileOutputStream(file);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            Student stu = new Student("瑪麗蘇", "男", 18);
            oos.writeObject(stu);  // 核心方法
        }
    }

    // 反序列化讀取
    public static void readObject() throws IOException, ClassNotFoundException {
        File file = new File(FILE_PATH);
        try (FileInputStream fis = new FileInputStream(file);
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            Student stu = (Student) ois.readObject();  // 需強制轉型
            System.out.println("name: " + stu.name);
            System.out.println("sex: " + stu.sex);   // null
            System.out.println("age: " + stu.age);   // 0
        }
    }
}

輸出結果分析

name: 瑪麗蘇
sex: null
age: 0

transient 修飾的 sex、age 未被序列化,反序列化時得到預設值(引用類型 null、基本類型 0)。

關鍵注意點總結

  1. 實現 Serializable:無方法的標記介面,僅告知 JVM 該類可序列化
  2. serialVersionUID 保持唯一:類結構變更時若不一致會拋 InvalidClassException,建議顯式聲明
  3. transient 跳過敏感/無需持久化字段:如密碼、臨時計算值
  4. 引用對象也須實現 Serializable:對象圖中任一節點不支援則全圖失敗
  5. 靜態字段不序列化:屬於類而非實例

常用方法速查

方法說明
writeObject(Object obj)將對象寫入底層流
readObject()讀取並還原對象,返回 Object 需轉型

序列化流程圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved