【工具类:FastJsonRedisSerializer】

工具类:FastJsonRedisSerializer

依赖

xml 复制代码
   <!--     主要用于处理 JSON 数据的序列化和反序列化-->
        <!--     序列化:将对象转换为一种可以存储或传输的格式(如 JSON、XML、二进制等)。这样可以将对象的状态保存到文件中,或通过网络发送到其他系统。-->
        <!--     反序列化:将序列化后的数据重新转换为对象的过程。这使得程序能够读取存储的数据并将其恢复为原来的对象形式。-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.53</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

yml文件

yml 复制代码
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

FastJsonRedisSerializer.java

java 复制代码
package com.nnutc.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * FastJsonRedisSerializer 是一个使用 FastJSON 库进行对象序列化和反序列化的 RedisSerializer 实现类。
 *
 * @param <T> 被序列化和反序列化的对象类型
 */
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

    private final Class<T> clazz; // 被序列化对象的类类型

    static {
        // 启用 FastJSON 的自动类型支持
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
    }

    /**
     * 构造函数,接受一个 Class<T> 类型的参数
     *
     * @param clazz 被序列化对象的类类型
     */
    public FastJsonRedisSerializer(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * 序列化方法,将对象转换为字节数组
     *
     * @param t 被序列化的对象
     * @return 序列化后的字节数组
     * @throws SerializationException 如果序列化失败
     */
    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0]; // 如果对象为 null,返回空字节数组
        }
        try {
            return JSON.toJSONString(t, SerializerFeature.WriteClassName)
                    .getBytes(DEFAULT_CHARSET);
        } catch (Exception e) {
            throw new SerializationException("序列化对象失败: " + t, e);
        }
    }

    /**
     * 反序列化方法,将字节数组转换为对象
     *
     * @param bytes 要反序列化的字节数组
     * @return 反序列化得到的对象
     * @throws SerializationException 如果反序列化失败
     */
    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length == 0) {
            return null; // 如果字节数组为 null 或空,返回 null
        }
        try {
            String json = new String(bytes, DEFAULT_CHARSET); // 将字节数组转换为 JSON 字符串
            return JSON.parseObject(json, clazz); // 使用 FastJSON 将 JSON 字符串解析为指定类型的对象
        } catch (Exception e) {
            throw new SerializationException("反序列化字节数组失败: " + bytes, e);
        }
    }
}
相关推荐
哎呦没2 分钟前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟6 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity7 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天7 小时前
java的threadlocal为何内存泄漏
java
caridle7 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^7 小时前
数据库连接池的创建
java·开发语言·数据库