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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:01