序列化是將物件轉換為位元組串流,以便網路傳輸或持久化儲存;反序列化則是將位元組串流還原為物件。Java 遠端呼叫 (RPC)、分散式快取、訊息佇列等場景都大量依賴序列化機制。
Serializable 介面的物件public static byte[] serialize(Object obj) throws Exception {
if (obj == null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(os);
out.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize(byte[] bytes) throws Exception {
if (bytes == null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(is);
return in.readObject();
}
short、StackTraceElement 等需特殊處理)// 需引入 hessian 依賴: com.caucho:hessian:4.0.74
public static byte[] serialize(Object object) throws Exception {
if (object == null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianSerializerOutput hessianOutput = new HessianSerializerOutput(os);
hessianOutput.writeObject(object);
return os.toByteArray();
}
public static Object deserialize(byte[] bytes) throws Exception {
if (bytes == null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
HessianSerializerInput hessianInput = new HessianSerializerInput(is);
return hessianInput.readObject();
}
| 維度 | Java 原生 | Hessian |
|---|---|---|
| 序列化體積 | 大 (含完整中繼資料) | 小 (僅資料+型別) |
| 序列化速度 | 較慢 | 快 2-5 倍 |
| 反序列化速度 | 較慢 | 快 |
| 相容性 | 極強 (JDK 內建) | 需第三方庫 |
| 跨語言 | 困難 | 原生支援 |
| 物件圖支援 | 完整 (含循環參考) | 良好 (有參考機制) |
| 特殊型別 | 全支援 | 部分不支援 |
沒有完美的序列化方案,只有最適合場景的選擇。理解各方案的權衡 (體積、速度、相容性、跨語言),才能做出正確架構決策。