【工具类: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);
        }
    }
}
相关推荐
白晨并不是很能熬夜16 分钟前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
斯普润布特28 分钟前
物联网-Spring+Netty 框架整合
java·物联网·netty
简简单单就是我_hehe30 分钟前
后端链路追踪局部采集和全量采集配置说明
java·开发语言
zshs00030 分钟前
#从偶发无字幕到补偿探测链路:一次 B 站字幕导入问题的完整收敛过程
java·后端·重构
存在的五月雨1 小时前
SpringBoot 基于数据库的动态定时任务管理器实现方案
java·spring boot
椰羊~王小美1 小时前
@RequestMapping注解的各个属性作用
java
Yeh2020582 小时前
request与response笔记
java·前端·笔记
程序员老邢2 小时前
【产品底稿 07】商助慧 Admin 运维模块落地:从 “能跑” 到 “能运维”,3 个页面搞定日常排障
java·运维·经验分享·spring boot·后端
元宝骑士2 小时前
Spring @Async 异步无法获取当前登录用户?Sa-Token 1.34.0 终极踩坑解决方案
java·后端
0xDevNull2 小时前
Java项目中Redis热点Key自动检测方案详细教程
java·spring boot·redis