You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历序列化文件反序列化时遇Java StreamCorruptedException问题求助

解决序列化文件读取时的StreamCorruptedException问题

我创建了一个存储序列化数据的文件,想要遍历该文件并将对象添加到列表中,但操作时持续出现StreamCorruptedException错误,错误提示为invalid type code: AC。相关代码和错误信息如下:

问题代码

public static ImperialDrone retrieveDrone(String filename) {
        
        try {
            System.out.println(filename);
            boolean cont = true;
            ArrayList<ImperialDrone> list = new ArrayList<>();
            ObjectInputStream Sin = new ObjectInputStream(new FileInputStream("C:\\Users\\13023\\eclipse-workspace\\Chunduru_HW6\\src\\chunduru\\STORAGE\\DStore"));
            while(cont){
                ImperialDrone I = null;
              try {
                  I = (ImperialDrone) Sin.readObject();
              } catch (EOFException E) {
                  E.printStackTrace();
              }
                if(I != null) {
                     list.add(I);
                     System.out.println("Added 1");
                }
                  
                else {
                    cont = false;
                }
                   
             }
            
            Sin.close();
            return list.get(0);
            
        } 
        catch (Exception e) {
            e.printStackTrace();
            System.out.println(e);
        }
        return null;
        
    }

错误信息

java.io.StreamCorruptedException: invalid type code: AC
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1764)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467)
    at Chunduru_HW6/chunduru.INTERFACES.DroneOperations.retrieveDrone(DroneOperations.java:49)
    at Chunduru_HW6/chunduru.MAIN.Chunduru.main(Chunduru.java:26)
java.io.StreamCorruptedException: invalid type code: AC

解决建议

1. 修复读取逻辑中的EOFException处理

当前代码捕获EOFException后仅打印栈轨迹,继续循环尝试读取,这会导致后续读取操作访问到文件末尾后的无效数据,触发StreamCorruptedException。正确的做法是捕获到EOFException后直接终止循环:

修改后的读取代码:

public static ImperialDrone retrieveDrone(String filename) {
    try {
        System.out.println(filename);
        ArrayList<ImperialDrone> list = new ArrayList<>();
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (ObjectInputStream Sin = new ObjectInputStream(new FileInputStream("C:\\Users\\13023\\eclipse-workspace\\Chunduru_HW6\\src\\chunduru\\STORAGE\\DStore"))) {
            while (true) {
                try {
                    ImperialDrone I = (ImperialDrone) Sin.readObject();
                    list.add(I);
                    System.out.println("Added 1");
                } catch (EOFException e) {
                    // 读取到文件末尾,终止循环
                    break;
                }
            }
        }
        // 避免列表为空时调用get(0)引发索引越界
        if (!list.isEmpty()) {
            return list.get(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e);
    }
    return null;
}

2. 检查写入序列化文件的逻辑

invalid type code: AC最常见的原因是多次创建ObjectOutputStream写入同一个文件。每个ObjectOutputStream都会在文件开头写入序列化头部标记,重复写入会导致文件结构损坏,读取时无法解析。

正确的写入方式是复用同一个ObjectOutputStream完成所有对象的写入:

// 示例:正确的对象写入逻辑
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:\\Users\\13023\\eclipse-workspace\\Chunduru_HW6\\src\\chunduru\\STORAGE\\DStore"))) {
    out.writeObject(drone1);
    out.writeObject(drone2);
    // 写入所有需要序列化的对象
} catch (IOException e) {
    e.printStackTrace();
}

不要每次写入单个对象都重新创建ObjectOutputStream,这会破坏文件的序列化结构。

3. 验证序列化文件完整性与类兼容性

  • 如果文件是中途写入中断或手动修改过,会导致文件损坏,可重新生成序列化文件测试。
  • 确保ImperialDrone类的serialVersionUID在写入和读取时保持一致,且类结构(字段、继承关系)没有发生未兼容的变更,否则也会引发解析错误。

内容的提问来源于stack exchange,提问作者Sanjay Chunduru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:40:47