兩者高度重疊:序列化常作為持久化的手段(如將流寫入文件),但持久化還包含 SQL 映射、索引、事務等數據庫級能力。
java.io.Serializable:標記接口,實現後自動支持序列化。ObjectOutputStream.writeObject():遞歸序列化對象圖,維護引用表防重複寫入。ObjectInputStream.readObject():反序列化,需類路徑下存在同 serialVersionUID 的類。對 transient 或 static 字段,JVM 忽略自動序列化。可重寫:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(socket.getInetAddress());
out.writeInt(socket.getPort());
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
InetAddress addr = (InetAddress) in.readObject();
int port = in.readInt();
socket = new Socket(addr, port);
}
實現 Externalizable 需自行實現 writeExternal/readExternal,靈活但安全風險較高(方法為 public),敏感數據需加密。
極端情況下可建單表 Object(OID, Bytes) 存序列化流,但喪失 SQL 查詢優勢。