遍历序列化文件反序列化时遇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
相关产品推荐
相关产品推荐

