GenericJackson2JsonRedisSerializer序列化遇到的坑
问题现象
工程使用redis作为缓存,起初使用GenericJackson2JsonRedisSerializer作为序列化反序列化工具。一般正常的对象(set,get齐全),序列化以及解序列化都没有问题。但是一旦某个对象只有get方法,而没有set方法。就无法正常反序列化。
Redis序列化设置jackson
// hash的value序列化方式采用jackson
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
// value序列化方式采用jackson
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
测试对象
public class Demo {
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getGrade(){ return "grade1"; }
}
留意最后一个方法 getGrade(){ return “grade1”; } 只有get
测试方法
@org.junit.Test
public void test1(){
Demo demo = new Demo();
demo.setAge( 3 );demo.setName( "张三" );
RedisUtil.set( "demo",demo );
Demo demo1 = (Demo) RedisUtil.get( "demo" );
System.out.println(demo1.getName() +"...."+demo1.getGrade());
}
reids序列化内容
{"@class":"cn.pxwell.showen.Demo","name":"张三","age":3,"grade":"grade1"}
反序列化时Error提示
org.springframework.data.redis.serializer.SerializationException: Could not read JSON:Unrecognized field "grade" (class cn.pxwell.showen.Demo), not marked as ignorable (2 known properties: "name", "age"])
at [Source: (byte[])"{"@class":"cn.pxwell.showen.Demo","name":"张三","age":3,"grade":"grade1"}"; line: 1, column: 68] (through reference chain: cn.pxwell.showen.Demo["grade"]); nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "grade" (class cn.pxwell.showen.Demo), not marked as ignorable (2 known properties: "name", "age"])
at [Source: (byte[])"{"@class":"cn.pxwell.showen.Demo","name":"张三","age":3,"grade":"grade1"}"; line: 1, column: 68] (through reference chain: cn.pxwell.showen.Demo["grade"])
Error中提示:
Unrecognized field “grade” (class cn.pxwell.showen.Demo), not marked as ignorable
改用fastJson作为序列化工具
// hash的value序列化方式采用fastJson
redisTemplate.setHashValueSerializer(new GenericFastJsonRedisSerializer());
// value序列化方式采用fastJson
redisTemplate.setValueSerializer(new GenericFastJsonRedisSerializer());
实体类以及测试代码同上
reids序列化内容
{"@type":"cn.pxwell.showen.Demo","age":3,"grade":"grade1","name":"张三"}
最终运行结果
张三....grade1
结论
GenericJackson2JsonRedisSerializer在反序列化时会有意想不到的情况,当然大佬们可以重新该写下内部的实现。
改用阿里的GenericFastJsonRedisSerializer 没有遇到这样的问题。
两者序列化后的格式差不多,但我更愿意用GenericFastJsonRedisSerializer 。毕竟GenericJackson2JsonRedisSerializer已经坑了我一把!
至于其他情况暂时还没遇到。愿分享。