在使用Redisson 作为redis客户端操作时,一般需要自己实现序列化,不然redis看到的都是乱码(二进制)。但是在自己实现的过程中发现一个问题Java.lang.ClassCastException: class com.alibaba.fastjson.JSONObject cannot be cast to class。
这是因为在序列化是 FastJSON会向redis填充@Type类型,反序列化时,无法根据Type类型值转化为对应的类,导致报错。
解决方案:
FASTJSON支持AutoType功能,这个功能会在序列化的JSON字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。
注意这是是FASTJSON2,版本1好像是不支持的。
然后我在自己的代码里做了修改。
static class RedisCodec extends BaseCodec {
private final Encoder encoder = in -> {
ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
try {
ByteBufOutputStream os = new ByteBufOutputStream(out);
String jsonString = JSON.toJSONString(in, JSONWriter.Feature.WriteClassName);
os.write(jsonString.getBytes(StandardCharsets.UTF_8));
return os.buffer();
} catch (IOException e) {
out.release();
throw e;
} catch (Exception e) {
out.release();
throw new IOException(e);
}
};
private final Decoder<Object> decoder = (buf, state) -> JSON.parseObject(new ByteBufInputStream(buf),
Object.class, JSONReader.Feature.SupportAutoType);
解码时JSONReader.Feature.SupportAutoType就是开启自动类型识别。