GenericJackson2JsonRedisSerializer反序列化问题

更新时间:2023-07-25 19:47:59 阅读: 评论:0

GenericJackson2JsonRedisSerializer反序列化问题
门用英语怎么说在使⽤Spring-data-redis 时, 很多⽂章都推荐使⽤GenericJackson2JsonRedisSerializer 作为redisTemplate 的序列化执⾏器,
然⽽,在遇到类中有 LocalDateTime 等类型时, 反序列化会有问题,⼤概错误提⽰为:
org.dis.rializer.SerializationException: Could not read JSON: Cannot construct instance of
`java.time.LocalDateTime` (no Creators, like default construct, exist): cannot derialize from Object value (no delegate- or property-bad Creator)
⽐如这个类:
存在redis ⾥⾯的值⼤概长这样,可以看到 LocalDateTime的内部字段都当作json数据存起来了,反序列化时肯定找不到
构造器。
解决办法:
土豆炖白菜
1、先添加依赖,(注意:在设置了spring boot的parent的情况下不需要指定具体的版本,也不建议指定某个具体版本)
<!-- /artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
2、⾃定义ObjectMapper ,然后注⼊到GenericJackson2JsonRedisSerializer ,就可以直接使⽤了。
ObjectMapper om = new ObjectMapper();
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
.addSerializer(new NullValueSerializer()));
以下是原始⽂章,已作废!
不知道以前⾃⼰在想什么, 做出这种脱了裤⼦放屁的操作。
2、然后我们依赖GenericJackson2JsonRedisSerializer 新写⼀个类:
ample.demoredis.util;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.dule.SimpleModule;
import com.fasterxml.std.StdSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.cache.support.NullValue;
import org.dis.rializer.GenericJackson2JsonRedisSerializer;
import org.dis.rializer.RedisSerializer;
import org.dis.rializer.SerializationException;
怎么网上赚钱import java.io.IOException;
public class GenericJackson2JsonRedisSerializerEx implements RedisSerializer<Object> {
protected GenericJackson2JsonRedisSerializer rializer = null;
public GenericJackson2JsonRedisSerializerEx() {
ObjectMapper om = new ObjectMapper();
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
.addSerializer(new NullValueSerializer()));
this.rializer = new GenericJackson2JsonRedisSerializer(om);
}
public GenericJackson2JsonRedisSerializerEx(ObjectMapper om) {
this.rializer = new GenericJackson2JsonRedisSerializer(om);
男孩图片卡通
}
@Override
public byte[] rialize(Object o) throws SerializationException {
return rializer.rialize(o);
}
@Override
public Object derialize(byte[] bytes) throws SerializationException {
return rializer.derialize(bytes);
}
一串对折分两边各一半protected class NullValueSerializer extends StdSerializer<NullValue> {
private static final long rialVersionUID = 1999052150548658807L;
private final String classIdentifier="@class";
NullValueSerializer() {
super(NullValue.class);
}
public void rialize(NullValue value, JsonGenerator jgen, SerializerProvider provider) throws IOException {            jgen.writeStartObject();
jgen.writeStringField(this.classIdentifier, Name());
jgen.writeEndObject();
}
}
}
3、最后这么使⽤:
@Bean
不等式公式大全
RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
def template = new RedisTemplate()
template.tConnectionFactory(redisConnectionFactory)
template.tDefaultSerializer(new GenericJackson2JsonRedisSerializerEx())
template.tEnableDefaultSerializer(true)
return template
七上历史思维导图}写信英语
4、运⾏成功,redis⾥⾯的值长这样:
这⾥不得不吐槽⼀下GenericJackson2JsonRedisSerializer 的作者,
⾥⾯的内部类和域都是private 的,改源码限制颇多,虽然原始类很简单,copy⼀份源码出来稍加改造就⾏但是对于懒⼈来说,连代码都懒得copy (虽然万不得已还是考了他的内部类,万恶的private)
参考:

本文发布于:2023-07-25 19:47:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1116920.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:序列化   源码   注意   指定
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图