【工具类: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);
        }
    }
}
相关推荐
琢瑜13 分钟前
问题1:Oracle Java路径干扰。问题2:环境变量加载顺序问题
java·maven
Yang-Never14 分钟前
Open GL ES->以指定点为中心缩放图片纹理的完整图解
android·java·开发语言·kotlin·android studio
编程修仙19 分钟前
第十一篇 Spring事务
xml·java·数据库·spring
7哥♡ۣۖᝰꫛꫀꪝۣℋ21 分钟前
Spring Boot ⽇志
java·spring boot·后端
清晓粼溪22 分钟前
Mybatis02:核心功能
java·mybatis
weisonx23 分钟前
为什么要多写文章博客
java·c++
大佐不会说日语~31 分钟前
SSE 流式输出 Markdown 实时渲染问题解决方案
java·vue.js·sse·spring ai·前端实时渲染
塔能物联运维37 分钟前
设备断网时数据丢失,后来启用本地缓存+异步重传队列
java·开发语言·缓存
橙序员小站1 小时前
Java 接入 Pinecone 搭建知识库踩坑实记
java·后端