Java中将序列化对象写入数据库BLOB字段,需先用ObjectOutputStream序列化为byte[],再通过PreparedStatement.setBytes()(推荐)或setBlob()写入;注意Serializable实现、serialVersionUID定义、transient敏感字段及流正确关闭。

Java 中将序列化字节流写入数据库 BLOB 字段,核心是:先序列化对象为 byte[],再通过 JDBC 的 PreparedStatement.setBlob() 或 setBytes() 写入。推荐优先使用 setBytes()(简单直接),除非需流式写入超大对象。
序列化对象为字节数组
使用 ObjectOutputStream 将可序列化对象(需实现 Serializable)写入 ByteArrayOutputStream:
- 确保目标类所有非瞬态(non-transient)字段都可序列化,否则抛
NotSerializableException - 建议显式定义
private static final long serialVersionUID = 1L;,避免版本升级后反序列化失败 - 敏感字段用
transient修饰,防止被序列化(如密码、临时缓存)
通过 PreparedStatement 写入 BLOB 字段
有两种常用方式,推荐第一种:
-
用
setBytes(int, byte[]):最简洁,适合中等大小对象(几 MB 内)。BLOB 字段类型在建表时需为BLOB(MySQL)、BLOB或BYTEA(PostgreSQL)、BLOB(Oracle) -
用
setBlob(int, InputStream):适合超大对象(如百 MB 级),避免内存一次性加载。需传入new ByteArrayInputStream(byteArray)或文件流
完整示例代码(含异常处理)
以 MySQL 为例,假设表 user_data 有 id INT 和 data BLOB 字段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("INSERT INTO user_data (id, data) VALUES (?, ?)")) {
ps.setInt(1, 123);
// 序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(new Person("Alice", 30)); // Person 实现 Serializable
}
// 写入 BLOB(方式一:setBytes)
ps.setBytes(2, baos.toByteArray());
ps.executeUpdate();
} catch (SQLException | IOException e) {
throw new RuntimeException("写入 BLOB 失败", e);
}
注意:不要手动关闭 ByteArrayOutputStream(它不涉及系统资源),但 ObjectOutputStream 关闭是必须的,用于刷新缓冲区并写入 EOF 标记,否则反序列化会失败。
读取时的对应操作
反序列化时需严格匹配类结构和 serialVersionUID:
- 用
ResultSet.getBytes()获取byte[],再用ObjectInputStream反序列化 - 若写入时用了流式
setBlob,读取可用getBinaryStream()避免内存峰值 - 生产环境建议加版本字段(如
schema_version)管理序列化格式演进

















