Java将文件对象反序列化为List时报ClassCastException如何解决?
问题根因
你遇到的报错核心是反序列化读取到的对象实际是单个EigentumsWohnung实例,并非你预期的List<Flat>集合,问题出在你当初把对象写入文件的序列化逻辑,并非当前反序列化代码的语法错误。
java.lang.ClassCastException: class hausverwaltung.EigentumsWohnung cannot be cast to class java.util.List (hausverwaltung.EigentumsWohnung is in module hausverwaltung of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
修复方案
二选一即可:
方案1:修改序列化写入逻辑,适配现有反序列化代码
如果你需要批量存储多个Flat对象,把写入文件的序列化代码调整为写入List集合即可,修改后你当前的反序列化代码可以直接正常运行:
// 正确的序列化写入示例 List<Flat> flats = new ArrayList<>(); flats.add(new EigentumsWohnung()); // 所有需要存储的对象都先加入集合 ObjectOutputStream writer = new ObjectOutputStream(new FileOutputStream(file)); writer.writeObject(flats); // 写入的是List类型对象 writer.close();
方案2:修改反序列化逻辑,适配现有的单对象存储文件
如果你就是只需要存储单个Flat对象,不需要集合,直接调整反序列化代码,读取单个对象后封装为List返回即可:
public List<Flat> getFlats() { List<Flat> flats = new ArrayList<Flat>(); try { ObjectInputStream reader = new ObjectInputStream(new FileInputStream(file)); // 读取单个Flat对象,EigentumsWohnung是Flat子类可直接强转 Flat flat = (Flat) reader.readObject(); flats.add(flat); reader.close(); } catch (Exception e) { System.out.println("Deserialisation error: "+e); System.exit(1); } return flats; }
额外优化建议
为了避免隐性类型转换问题,反序列化时可先做类型校验再转换:
Object obj = reader.readObject(); if (obj instanceof List) { flats = (List<Flat>) obj; } else if (obj instanceof Flat) { flats.add((Flat) obj); } else { throw new IllegalArgumentException("文件存储的对象类型不匹配"); }
内容的提问来源于stack exchange,提问作者peebee
相关产品推荐
相关产品推荐

