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

Java中无法从ResultSet加载SQLite数据库对象的问题

解决SQLite中加载序列化HashMap子类对象的问题

看起来你遇到的是序列化/反序列化结合SQLite BLOB存储时的常见问题——存储时一切正常,但加载时反序列化失败。结合你的场景,我来拆解可能的原因和解决方案:

核心问题分析

你的MyHashMap是HashMap的子类,本身继承了Serializable接口,序列化逻辑本身是可行的。问题大概率出在SQLite BLOB的读写方式或者反序列化时的细节处理上。

第一步:确认你的存储/加载代码是否规范

先给你一套经过验证的标准实现,对比下你的代码有没有差异:

1. 正确的对象存储代码

// 初始化并填充你的Map
MyHashMap myMap = new MyHashMap();
myMap.put("test1", 100);
myMap.put("test2", 200);

// 将对象序列化为字节数组
byte[] serializedData;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(bos)) {
    oos.writeObject(myMap);
    serializedData = bos.toByteArray();
} catch (IOException e) {
    e.printStackTrace();
    return; // 处理序列化异常
}

// 插入SQLite数据库
String insertSql = "INSERT INTO MyTable (data) VALUES (?)";
try (PreparedStatement pstmt = connection.prepareStatement(insertSql)) {
    pstmt.setBytes(1, serializedData);
    pstmt.executeUpdate();
} catch (SQLException e) {
    e.printStackTrace();
}

2. 正确的对象加载代码

MyHashMap loadedMap = null;
String selectSql = "SELECT data FROM MyTable WHERE rowid = ?";
try (PreparedStatement pstmt = connection.prepareStatement(selectSql)) {
    pstmt.setInt(1, 1); // 替换为你要查询的rowid
    try (ResultSet rs = pstmt.executeQuery()) {
        if (rs.next()) {
            // 读取BLOB字节数组(两种方式都可以,推荐第一种)
            byte[] data = rs.getBytes("data");
            // 或者用Blob对象读取:
            // Blob blob = rs.getBlob("data");
            // byte[] data = blob.getBytes(1, (int) blob.length());

            // 反序列化为对象
            try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
                 ObjectInputStream ois = new ObjectInputStream(bis)) {
                loadedMap = (MyHashMap) ois.readObject();
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

// 现在可以使用loadedMap了
if (loadedMap != null) {
    System.out.println(loadedMap.get("test1"));
}

第二步:排查常见错误点

如果你的代码和上面类似但还是报错,检查以下几点:

  • 异常类型是什么? 捕获异常并打印堆栈信息,比如InvalidClassException可能是因为类的serialVersionUID不匹配(但你已经显式设置为0L,只要存储后类没修改就没问题);ClassNotFoundException则要确保MyHashMap类在当前类路径中。
  • BLOB读取是否完整? 如果用getBlob方式读取,一定要确保getBytes的起始位置是1,长度是blob.length(),避免字节数组被截断。
  • SQLite连接是否正确? 确保加载时使用的数据库连接和存储时指向同一个数据库文件,避免读错库。

额外建议

如果还是解决不了,建议你把抛出的具体异常信息贴出来,这样能更精准定位问题——比如是反序列化时的类不兼容,还是字节数组损坏?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:53