昨天在程序中向redis中存取对象,获取对象的时候遇到了一个问题,经过一番询问和查询相关资料终于弄明白了,认为有必要记录下来,对以后的自己或者其他人都有一定的帮助。我先把问题阐述一遍:对象A_model存取到redis中,但是从redis中获取后存取到B_model,即使A_model和B_model中变量都是一样的,但是依然会报java.lang.ClassCastException错误。导致会报java.lang.ClassCastException错误的根本原因是序列化的问题。经过定义的序列化存取到redis中,也把数据类型存取进去了,所以获取该key对应的数据的时候也必须是改数据类型。
下面是测试类:
package com.chr.test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.ycy.domain.User; import com.ycy.domain.User_A; import com.ycy.service.impl.UserOperationsServiceImpl; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:config/spring-context.xml", "classpath:config/redis-context.xml" }) public class RedisTest { @Autowired private UserOperationsServiceImpl userops; @Test public void Test1() { // System.out.println(userops.getUser("test")); Object user = userops.getUser("1"); System.out.println(user); } @Test public void Test2() { //System.out.println(userops.getUser("a")); // System.out.println(userops.getUser("test")); // userops.add("test", "aaa"); User user = new User(); user.setId("1"); user.setName("bb"); user.setPassword("1234"); userops.add(user); } @Test public void Test3() { //System.out.println(userops.getUser("a")); //System.out.println(userops.getUser("test")); userops.del("test"); } @Test public void Test4() { User user = new User(); user.setId("1"); user.setName("bb"); user.setPassword("1234"); byte[] byt= serialize(user); Object obj=unserizlize(byt); User_A str; try { str = (User_A)obj; System.out.println(str); } catch (Exception e) { e.printStackTrace(); } if(obj instanceof User){ System.out.println(obj); } } //序列化 public static byte [] serialize(Object obj){ ObjectOutputStream obi=null; ByteArrayOutputStream bai=null; try { bai=new ByteArrayOutputStream(); obi=new ObjectOutputStream(bai); obi.writeObject(obj); byte[] byt=bai.toByteArray(); return byt; } catch (IOException e) { e.printStackTrace(); } return null; } //反序列化 public static Object unserizlize(byte[] byt){ ObjectInputStream oii=null; ByteArrayInputStream bis=null; bis=new ByteArrayInputStream(byt); try { oii=new ObjectInputStream(bis); Object obj=oii.readObject(); return obj; } catch (Exception e) { e.printStackTrace(); } return null; } }