Java对象序列化为MySQL BLOB存储与读取实现

周予安
周予安
发布时间:2026-10-15 | 3人浏览过
原创

在需要将复杂Java对象持久化到关系型数据库时,通过序列化为二进制格式存入MySQL的BLOB字段是一种常见方案。该过程依赖于Java原生的对象流机制,要求目标类必须正确实现序列化接口以确保数据的安全存取。

结果或目标

实现Java对象到MySQL BLOB 类型字段的自动转换与恢复,包含完整的序列化(写入)与反序列化(读取)工具及实体类规范。

准备条件

  1. 数据库表结构:表中需存在一个类型为 BLOB(或 MEDIUMBLOB/LONGBLOB)的字段用于存储二进制数据。
  2. 实体类规范:所有需要存储的Java Bean必须实现 java.io.Serializable 接口,且必须显式定义 serialVersionUID。这是为了防止类结构微调后导致反序列化时的 InvalidClassException。
  3. 依赖嵌套类:实体类中包含的其他引用类型变量(如内部类、外部对象),也必须全部实现序列化接口,否则在读取出错时报错。

真实操作顺序

第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步:执行存储与读取测试

目的:验证流程是否通畅。

操作逻辑:

  1. 实例化 UserVO 并赋值。
  2. 调用 BlobUtil.setObject() 获取 byte[],将其存入数据库(此处省略DB连接代码,直接使用转换后的数组演示逻辑)。
  3. 假设从数据库读回该字节数组,调用 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 Bytes
  • Blob:最大 65 KB
  • MediumBlob:最大 16 MB
  • LongBlob:最大 4 GB

简要总结

通过Java的IO流对象序列化技术,可以将复杂的对象结构直接映射为二进制的 BLOB 数据存入MySQL。关键在于严格遵循 Serializable 协议约定,处理好类版本的UID一致性。以上就是Java对象存储为MySQL BLOB数据的详细内容,更多关于Java序列化与MySQL数据存储的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表