序列化 = 將記憶體中的物件轉換為位元組序列(可儲存檔案、網路傳輸);反序列化 = 從位元組序列還原物件。
兩個 Java 程式(甚至不同機器)要交換物件,網路只能傳輸位元組。序列化把物件「壓扁」成 byte[],對方收到後「吹氣」還原。
// 發送端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(myObject);
byte[] data = bos.toByteArray();
socket.getOutputStream().write(data);
// 接收端
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
MyClass obj = (MyClass) ois.readObject();
直接將物件寫入檔案,下次啟動還原,免去手動解析 JSON/XML/屬性檔。
Redis、Memcached、Tomcat Cluster 複製 Session 時,皆需物件可序列化。
java.io.Serializable 標記介面(無方法)。serialVersionUID 驗證版本相容性(建議顯式宣告)。non-transient、non-static 欄位。writeObject/readObject 控制細節。序列化產生的位元組**可被反編譯還原**,不具備機密性。若需安全,請配合加密演算法(AES)或使用 JWT/Protobuf 等替代方案。
| 方案 | 優點 | 缺點 |
|---|---|---|
| Java 原生序列化 | 零配置、支援任意物件圖 | 體積大、速度慢、跨語言差、安全風險 |
| JSON (Jackson/Gson) | 人類可讀、跨語言、生態豐富 | 需手動映射、不支援循環參考(需配置) |
| Protocol Buffers | 極小體積、極快、強型別、跨語言 | 需定義 .proto、學習曲線 |
| Kryo / FST | 比原生快 5-10 倍、體積小 | 需額外依賴、僅 Java |
private static final long serialVersionUID = 1L;。transient(密碼、資料庫連線等)。理解序列化本質是「物件扁平化為位元組」,即可在正確場景正確使用。