【工具类: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);
        }
    }
}
相关推荐
Java中的战斗机几秒前
redis缓存工具类(Java)
java·redis·缓存
赵同志2 分钟前
学习Java (五)
java·学习
pan_junbiao3 分钟前
SpringBoot使用@Slf4j注解实现日志输出
java·spring boot·spring
崔hy5 分钟前
JAVA基础:lock锁底层机制
java·开发语言
小湘西7 分钟前
ConcurrentHashMap 的一些总结
java·开发语言
william.zhang(张)9 分钟前
深入Java反射:灵活性与性能的双刃剑
java·开发语言·python
wuming先生18 分钟前
java后端项目技术记录
java·开发语言
Violet永存24 分钟前
算法:按既定顺序创建目标数组
java·数据结构·算法
陈小唬24 分钟前
算法——二分查找
java·数据结构·算法
救救孩子把26 分钟前
Java面试题之JVM20问
java·开发语言·jvm