Java爬坑

Wesley13
• 阅读 362

redis序列化选择方式

 1  public CacheManager cacheManager(RedisTemplate redisTemplate) {
 2         //设置序列化Key的实例化对象
 3         redisTemplate.setKeySerializer(new StringRedisSerializer());
 4         //设置序列化Value的实例化对象
 5         redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
 6         RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
 7         // 使用前缀
 8         redisCacheManager.setUsePrefix(true);
 9         redisCacheManager.setCachePrefix(new DefaultRedisCachePrefix(":"));
10         // 设置默认缓存的过期时间
11         redisCacheManager.setDefaultExpiration(86400);// 一天
12     
13         redisCacheManager.setExpires(expires);
14 
15         return redisCacheManager;

要序列化class Demo

1 public class Demo {
2     private Long id;
3     private String name;
4     private LocalDateTime time;
5    
6 }

在redis中查看

 1 {
 2   "@class": "com.karmay3d.Demo",
 3   "id": 10000000001,
 4   "name": "测试序列化",
 5   "time": {
 6     "dayOfMonth": 15,
 7     "dayOfWeek": "TUESDAY",
 8     "dayOfYear": 227,
 9     "month": "AUGUST",
10     "monthValue": 8,
11     "year": 2017,
12     "hour": 14,
13     "minute": 45,
14     "second": 51,
15     "nano": 921000000,
16     "chronology": {
17       "@class": "java.time.chrono.IsoChronology",
18       "id": "ISO",
19       "calendarType": "iso8601"
20     }
21   }
22 }

报的异常

1 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Can not construct instance of java.time.LocalDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
2  at [Source: [B@68d651f2; line: 1, column: 81] (through reference chain: com.karmay3d.Demo["time"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.LocalDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
3  at [Source: [B@68d651f2; line: 1, column: 81] (through reference chain: com.karmay3d.Demo["time"])
4 ......
5 Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.LocalDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
6  at [Source: [B@68d651f2; line: 1, column: 81] (through reference chain: com.karmay3d.Demo["time"])
7     at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
8     at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)
9 ......

修改

LocalDateTime属性加上注解 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
@JsonSerialize(using = LocalDateTimeSerializer.class)

1 public class Demo {
2     private Long id;
3     private String name;
4     @JsonDeserialize(using = LocalDateTimeDeserializer.class)
5     @JsonSerialize(using = LocalDateTimeSerializer.class)
6     private LocalDateTime time;
7     ......
8     }

redis里面对象

1 {
2   "@class": "com.karmay3d.Demo",
3   "id": 10000000001,
4   "name": "测试序列化",
5   "time": [2017,8,15,14,57,37,525000000]
6 }

然后就可以解决问题了

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
4个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
4个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
Stella981 Stella981
1年前
Redis 自定义对象 cannot be cast to java.lang.String
Redis序列化对象的时候报错如下java.lang.ClassCastException:com.ppdai.cbd.ddp.thirdparty.contract.bhxtzx.BHXTZXTaskcannotbecasttojava.lang.Stringatorg.springframework.d
Wesley13 Wesley13
1年前
Java序列化
在java中序列化对象需要实现一个接口,表示该对象可以被序列化java.io.Serializable接下来介绍一个关键字transient这个关键字的意思就是取反:如果一个对象实现了Serializable接口,加上这个关键字表示这个对象不能被序列化;如果一个对象没有实现Serializable接口,加上这个关键字表
红烧土豆泥 红烧土豆泥
1年前
解决Redis序列化Java8的LocalDateTime问题
在从Redis获取带有LocalDateTime类型属性的对象时,产生序列化和反序列化问题解决办法方式一:实体类上指定LocalDateTime的序列化器和反序列化器java@JsonDeserialize(usingLocalDateTimeDeserializer.class)//反序列化@JsonSerialize(usingLo
Wesley13 Wesley13
1年前
Java序列化(Serializable)与反序列化
序列化是干什么的简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存objectstates,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。什么情况下需要序列化1.当你想把的内存中的对象状态保存到一个文件中
Wesley13 Wesley13
1年前
java Redis Jedis存储Java对象
Redis入门–Jedis存储Java对象(Java序列化为byte数组方式)Redis入门–Jedis存储Java对象\(Java序列化为byte数组方式)原文地址:http://alanland.iteye.com/admin/blogs/1600685(https://www.oschina.net/action/GoT
Stella981 Stella981
1年前
Android Serializable与Parcelable原理与区别
一、序列化、反序列化是什么?(1)名词解释对象的序列化:把Java(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.2cto.com%2Fkf%2Fware%2FJava%2F)对象转换为字节序列并存储至一个储存媒介的过
Wesley13 Wesley13
1年前
Java序列化——transient关键字和Externalizable接口
  提到Java序列化,相信大家都不陌生。我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化。那么当我们在序列化Java对象时,如果不希望对象中某些字段被序列化(如密码字段),怎么实现呢?看一个例子:import java.io.Serializable;imp
Wesley13 Wesley13
1年前
Java序列化技术即将被废除!!!
我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。如果你还不熟悉Java序列化技术,请详细阅读《关于Jav