所有大更動:
main 也是差不多就不多放。
序列化簡單來說就是把「暫時存在記憶體的物件」變成可保存的資料
實際的過程會是:
在 Java 裡,序列化是指把物件的狀態轉換成一串可儲存或傳輸的位元資料(通常是 .ser 檔),
這樣程式結束後仍能「重建」出同樣的物件。
序列化 (Serialization):物件 → 位元資料(儲存或傳送)
反序列化 (Deserialization):位元資料 → 還原成物件
這就像是「把整個 ArrayList 凍結起來保存」,
下次開程式再「解凍」回來使用。
二、Java 的序列化是怎麼做到的
若一個類別實作了 Serializable 介面,
Java 就允許把該物件轉成檔案或位元流:
import java.io.*;
public class Student implements Serializable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
序列化:
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("students.ser"));
out.writeObject(studentList); // 儲存整個 ArrayList
out.close();
反序列化:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("students.ser"));
ArrayList studentList = (ArrayList) in.readObject();
in.close();
三、它的優點
保存物件狀態 可以直接把整個 List、Map 或自訂類別存起來
寫法簡單 幾行程式即可永久保存資料
可搭配網路傳輸 適合傳遞物件給其他程式(例如 RMI)
四、它的缺點
無法查詢或排序 儲存後是二進位檔,不能用 SQL 或條件篩選
相依於 Java 版本 不同版本可能無法反序列化
不能跨語言使用 只有 Java 能讀 .ser 檔
資料量大時效能差 每次都要整包「凍結/解凍」資料
但我最終沒有序列化,使用 SQLite 資料庫 來達成「資料持久化」。資料庫本身就自動保存所有學生資料,就不需要再用序列化來保存物件。
六、為什麼現在不需要序列化
StudentManager + SqliteStudentRepository 架構
已經達成「永久保存學生資料」的效果。
SQLite 幫我做了:
寫入硬碟(自動持久化)
查詢(SQL 指令)
修改、刪除(不用整包重寫)
自動避免重複
換句話說資料庫是另一種更專業的序列化系統。
它不只保存資料,還能查、排、統計、多人共用。