Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>
2022/8/17 6:22:56
本文主要是介绍Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景
将一个类型为Map<Integer, String>的一个Map对象放到redis中后,再次取出来时。当我们想便利Map.entrySet()获取每个Entry中的Key,如执行Integer key = entry.getKey();
那么在执行时就会报错:java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Map<Integer,String> cacheMap =(Map<Integer,String>)redisCache.get(key); for (Map.Entry<Integer, String> entry : cacheMap.entrySet()) { Integer key = entry.getKey(); String value = entry.getValue(); }
探究
debug时发现,在从redis获得这个Map<Integer,String> cacheMap对象时,它其中的Key的实际类型已经是String类型。这是因为redisson采用JsonJacksonCodec反序列化时,是用Object作为对象decode。在这一步会默认把key设置成string。
private final Decoder<Object> decoder = new Decoder<Object>() { @Override public Object decode(ByteBuf buf, State state) throws IOException { return mapObjectMapper.readValue((InputStream) new ByteBufInputStream(buf), Object.class); } };
测试
@Test public void testMap() throws IOException { ObjectMapper mapper = new ObjectMapper(); HashMap<Integer, String> map = new HashMap<>(); map.put(11, "little"); map.put(6, "nuts"); String s = mapper.writeValueAsString(map); //{"11":"little","6":"nuts"} System.out.println(s); HashMap o = (HashMap)mapper.readValue(s, Object.class); assertEquals(o.get("11"), "little"); assertNotEquals(o.get(11), "little"); }
总结
如果要针对,对象进行JsonJackson序列化时,如果对象是Map,则需要注意不要用Integer做为key。如果要将一个json对象作为redis缓存时,同样不要将Integer当作HashMap的key类型。
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
首发链接:https://www.cnblogs.com/lingyejun/p/16564464.html
这篇关于Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22Java创业学习:初学者的全面指南
- 2024-11-22JAVA创业学习:零基础入门到实战应用教程
- 2024-11-22Java创业学习:从零开始的Java编程入门教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22JAVA对接阿里云智能语音服务学习教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22Java副业学习:零基础入门到实战项目
- 2024-11-22Java副业学习:零基础入门指南
- 2024-11-22Java微服务学习:入门与实践指南
- 2024-11-22JAVA项目部署学习:从入门到实践