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

Java 序列化核心:ObjectOutputStream/ObjectInputStream 深度解析

     編輯:Java 相關知識

核心類職責

  • ObjectOutputStream:將基本類型與對象圖寫入 OutputStream,支援持久化文件、網絡傳輸、RMI 參數傳遞。
  • ObjectInputStream:從 InputStream 恢復對象圖,保證類型匹配、按需加載類、正確處理共享引用與循環引用。

可序列化條件

類必須實作 java.io.Serializable(標記介面)或 Externalizable。
默認機制:遞歸序列化所有非 transient、非 static 域;透過共享機制維護對象圖拓撲;反序列化時分配新對象、調用無參構造子初始化非序列化父類域。

自定義序列化協議

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject(); // 或手寫各域
    // 處理敏感域、計算衍生值等
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    // 恢復瞬態域、校驗不變量等
}

Externalizable 完全手動控制:實作 writeExternal(ObjectOutput)/readExternal(ObjectInput),自負版本管理。

實戰範例:Logon 類

public class Logon implements Serializable {
    private Date date = new Date();
    private String username;
    private transient String password; // 不序列化
    // 構造子、toString()...
    public static void main(String[] args) throws Exception {
        Logon a = new Logon("Morgan", "morgan83");
        // 序列化
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("Logon.out"));
        o.writeObject(a); o.close();
        // 反序列化
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("Logon.out"));
        a = (Logon) in.readObject();
        System.out.println(a); // password 顯示 (n/a)
    }
}

注意事項

  • serialVersionUID 顯式聲明,避免版本不兼容導致 InvalidClassException。
  • 大對象圖序列化性能開銷大,考慮 Externalizable 或替代方案(Protobuf、Kryo)。
  • 反序列化時會忽略構造子邏輯,敏感操作勿放在構造子。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved