Redis 序列化使用 Fastjson 2
大约 1 分钟
Redis 序列化使用 Fastjson 2
查看Jackson2JsonRedisSerializer
的源码知道这个类是实现了RedisSerializer<>
的,所以我们也要实现。
先定义一个Fastjson2RedisSerializer
并实现RedisSerializer<>
:
public class FastJson2RedisSerializer<T> implements RedisSerializer<T> {}
然后去实现方法
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
public class FastJson2RedisSerializer<T> implements RedisSerializer<T> {
static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(
// 按需加上需要支持自动类型的类名前缀,范围越小越安全
"com.***.***"
);
private final Class<T> clazz;
public FastJson2RedisSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONBytes(t, JSONWriter.Feature.WriteClassName);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (ArrayUtils.isEmpty(bytes)) {
return null;
}
return JSON.parseObject(bytes, clazz, AUTO_TYPE_FILTER);
}
}
然后再去配置类中实现我们的fastjson2的序列化配置
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisTemplateConfig {
@Resource
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
FastJson2RedisSerializer<Object> fastJson2RedisSerializer = new FastJson2RedisSerializer<>(Object.class);
StringRedisSerializer serializer = new StringRedisSerializer();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(serializer);
template.setHashKeySerializer(serializer);
template.setValueSerializer(fastJson2RedisSerializer);
template.setHashValueSerializer(fastJson2RedisSerializer);
template.afterPropertiesSet();
return template;
}
}
优化 FastJson2RedisSerializer
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.util.Objects;
@Slf4j
public class FastJson2RedisSerializer<T> implements RedisSerializer<T> {
static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(
// 按需加上需要支持自动类型的类名前缀,范围越小越安全
"com.***.***"
);
private final Class<T> clazz;
public FastJson2RedisSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (Objects.isNull(t)) {
return new byte[0];
}
try {
return JSON.toJSONBytes(t, JSONWriter.Feature.WriteClassName);
} catch (Exception e) {
log.error("Fastjson2 序列化错误:{}", e.getMessage());
throw new SerializationException("无法序列化: " + e.getMessage(), e);
}
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (ArrayUtils.isEmpty(bytes)) {
return null;
}
try {
return JSON.parseObject(bytes, clazz, AUTO_TYPE_FILTER);
} catch (Exception e) {
log.error("Fastjson2 反序列化错误:{}", e.getMessage());
throw new SerializationException("无法反序列化: " + e.getMessage(), e);
}
}
}