Bootstrap

fastjson 如何忽略@type类型解析

在使用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就是开启自动类型识别。

;