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
相关产品推荐
相关产品推荐

