【工具类: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);
        }
    }
}
相关推荐
二月夜6 小时前
剖析Java正则表达式回溯问题
java·正则表达式
xuhaoyu_cpp_java6 小时前
项目学习(三)分页查询
java·经验分享·笔记·学习
程序员二叉7 小时前
【Java】集合面试全套精讲|HashMap/ArrayList高频考点完整版
java·面试·哈希算法
cfm_29147 小时前
JVM GC垃圾回收初步了解
java·开发语言·jvm
心之伊始7 小时前
LangChain4j RAG 实战:Java 后端如何把本地文档接入 Embedding 检索链路
java·架构·源码分析·csdn
许彰午8 小时前
17_synchronized关键字深度解析
java·开发语言
Xzh04239 小时前
AI Agent 学习路线(Java 后端方向)
java·人工智能·学习
艾利克斯冰10 小时前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式
倒霉蛋小马10 小时前
Java新特性:record关键字
java·开发语言
折哥的程序人生 · 物流技术专研10 小时前
《Java 100 天进阶之路》第95篇:消息队列基础(RocketMQ/Kafka)(2026版)
java·面试·kafka·rocketmq·java-rocketmq·求职招聘