Java对象序列化为MySQL BLOB存储与读取实现
在需要将复杂Java对象持久化到关系型数据库时,通过序列化为二进制格式存入MySQL的BLOB字段是一种常见方案。该过程依赖于Java原生的对象流机制,要求目标类必须正确实现序列化接口以确保数据的安全存取。
结果或目标
实现Java对象到MySQL BLOB 类型字段的自动转换与恢复,包含完整的序列化(写入)与反序列化(读取)工具及实体类规范。
准备条件
- 数据库表结构:表中需存在一个类型为
BLOB(或MEDIUMBLOB/LONGBLOB)的字段用于存储二进制数据。 - 实体类规范:所有需要存储的Java Bean必须实现
java.io.Serializable接口,且必须显式定义serialVersionUID。这是为了防止类结构微调后导致反序列化时的InvalidClassException。 - 依赖嵌套类:实体类中包含的其他引用类型变量(如内部类、外部对象),也必须全部实现序列化接口,否则在读取出错时报错。
真实操作顺序
第1步:设计数据库字段
目的:确认存储位置支持大型二进制数据。
动作:在数据库建表语句中创建对应字段。例如:
CREATE TABLE your_table (
id BIGINT PRIMARY KEY,
object_data LONGBLOB
);
第2步:编写对象序列化工具类
目的:提供通用的 byte[] 转换方法,避免重复代码。
入口:新建 BlobUtil.java。
重要参数:利用 ByteArrayOutputStream 和 ObjectOutputStream 写入;利用 ByteArrayInputStream 和 ObjectInputStream 读取。
import java.io.*;
/**
* byte[]类型操作类
*/
public class BlobUtil {
/**
* 把object对象序列化为二进制字节数组
* @param object 待序列化的对象
* @return 二进制字节数组
*/
public static byte[] setObject(Object object) {
ByteArrayOutputStream baos = null;
ObjectOutputStream out = null;
try {
baos = new ByteArrayOutputStream();
out = new ObjectOutputStream(baos);
out.writeObject(object);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try { out.close(); } catch (IOException e) { e.printStackTrace(); }
}
if (baos != null) {
try { baos.close(); } catch (IOException e) { e.printStackTrace(); }
}
}
return baos.toByteArray();
}
/**
* 把二进制字节数组反序列化为object对象
* 注意:object当中的每个javaBean对象都必须实现序列化
* 最外层的类必须生成一个序列化ID
* @param bytes 从数据库读取的二进制数据
* @return 反序列化后的对象
*/
public static Object getObject(byte[] bytes) {
Object obj = null;
ByteArrayInputStream bais = null;
ObjectInputStream in = null;
try {
bais = new ByteArrayInputStream(bytes);
in = new ObjectInputStream(bais);
obj = in.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try { in.close(); } catch (IOException e) { e.printStackTrace(); }
}
if (bais != null) {
try { bais.close(); } catch (IOException e) { e.printStackTrace(); }
}
}
return obj;
}
}
第3步:定义可序列化的实体类
目的:满足上述工具类的约束条件。
动作:以 UserVO 为例,继承 Serializable 并定义ID。
import java.io.Serializable;
public class UserVO implements Serializable {
private static final long serialVersionUID = 1L;
private String userId;
private String userName;
private String password;
// getters and setters omitted for brevity
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}第4步:执行存储与读取测试
目的:验证流程是否通畅。
操作逻辑:
- 实例化
UserVO并赋值。 - 调用
BlobUtil.setObject()获取byte[],将其存入数据库(此处省略DB连接代码,直接使用转换后的数组演示逻辑)。 - 假设从数据库读回该字节数组,调用
BlobUtil.getObject()进行强转还原。
public class TestMain {
public static void main(String[] args) {
// 1. 准备数据
UserVO user = new UserVO();
user.setUserId("123456");
user.setUserName("张三");
// 2. 序列化 (模拟存入BLOB)
byte[] dataValue = BlobUtil.setObject(user);
System.out.println("=====对象转换成blob类型数据=====" + java.util.Arrays.toString(dataValue));
// 3. 反序列化 (模拟读取BLOB)
UserVO userVO = (UserVO) BlobUtil.getObject(dataValue);
System.out.println("=====blob类型数据转换成对象=====" + userVO.getUserName());
}
}完成判断
控制台打印输出显示字节数组正常生成,且成功还原出用户名称“张三”,即代表序列化与反序列化逻辑正确。
MySql BLOB类型对照参考
MySQL提供四种BLOB类型,区别仅在于最大长度不同,存储机制等同:
TinyBlob:最大 255 BytesBlob:最大 65 KBMediumBlob:最大 16 MBLongBlob:最大 4 GB
简要总结
通过Java的IO流对象序列化技术,可以将复杂的对象结构直接映射为二进制的 BLOB 数据存入MySQL。关键在于严格遵循 Serializable 协议约定,处理好类版本的UID一致性。以上就是Java对象存储为MySQL BLOB数据的详细内容,更多关于Java序列化与MySQL数据存储的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













