首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 物件序列化 ObjectOutputStream 輸出順序問題

     編輯:程式設計疑難解答

問題描述

使用 ObjectOutputStream 寫入多個物件,預期輸出順序為「cyh 男 20」「ym 女 20」,實際結果不符。

常見原因

  1. 寫入順序與預期不一致:檢查 writeObject(obj) 呼叫順序。
  2. 物件未實作 Serializable:導致拋出 NotSerializableException 中斷流。
  3. static/transient 欄位不參與序列化:若名稱、性別、年齡為 static,輸出為預設值。
  4. 多執行緒並發寫入同一流:導致資料交錯。

最小可復現範例

class Person implements Serializable {
    String name; String gender; int age;
    Person(String n, String g, int a) { name=n; gender=g; age=a; }
    @Override public String toString() { return name + " " + gender + " " + age; }
}

public class Test {
    public static void main(String[] args) throws Exception {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
            oos.writeObject(new Person("cyh", "男", 20));
            oos.writeObject(new Person("ym", "女", 20));
        }
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
            System.out.println(ois.readObject()); // cyh 男 20
            System.out.println(ois.readObject()); // ym 女 20
        }
    }
}

排查步驟

  1. 確認類別實作 Serializable 且 serialVersionUID 顯式宣告。
  2. 檢查寫入代碼順序,無條件分支導致順序顛倒。
  3. 若使用 reset(),注意會清除已寫入物件的引用快取,影響後續同一物件寫入。
  4. 在寫入/讀出前後加入日誌列印物件哈希碼驗證身份。

樓主未提供完整代碼,建議補全 writeObject 呼叫片段以便精準定位。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved