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

Java 物件序列化入門:ObjectOutputStream/ObjectInputStream 讀寫物件完整範例

     編輯:Java 相關知識

前言:序列化的實用價值

將記憶體中的物件狀態轉為位元組序列寫入檔案,下次啟動時還原,可實現「記住視窗位置大小」、「保存遊戲進度」、「離線快取」等功能。核心類別:ObjectOutputStream(寫出)、ObjectInputStream(讀入),前提是類別實作 java.io.Serializable 標記介面。

最小可行範例

1. 定義可序列化類別 Employee


class Employee implements Serializable {
    private String name;
    private double salary;
    public Employee(String name, double salary) {
        this.name = name; this.salary = salary;
    }
    @Override public String toString() {
        return "name = " + name + " salary = " + salary;
    }
}

2. 主程式:寫入兩個物件、讀回第一個


public class SerializeDemo {
    public static void main(String[] args) {
        try {
            // 建立物件
            Employee e1 = new Employee("kross", 123);
            Employee e2 = new Employee("ghost", 567.55);

            // 寫入檔案
            try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.txt"))) {
                out.writeObject(e1);
                out.writeObject(e2);
            }

            // 讀取檔案
            try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.txt"))) {
                Employee e3 = (Employee) in.readObject();
                System.out.println(e3.toString()); // 輸出: name = kross salary = 123.0
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

進階補充(實務必知)

  • serialVersionUID:建議顯式定義 private static final long serialVersionUID = 1L;,避免類別修改後反序列化報 InvalidClassException。
  • transient 關鍵字:標記不需序列化的欄位(如密碼、資料庫連線、暫存計算結果)。
  • 繼承與序列化:父類別實作 Serializable 子類別自動可序列化;父類別未實作時,反序列化會呼叫父類別無參建構子,父類別欄位需自行處理。
  • 效能考量:Java 預設序列化包含類別描述資訊,體積較大。高效能場景可考慮 Protobuf、Kryo、FlatBuffers 等二進位協定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved