redisson如何序列化

redisson如何序列化

Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格,相较于暴露底层操作的Jedis,Redisson提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务。         (推荐学习:Redis视频教程

序列化

Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储。

由Redisson默认的编码器为JsonJacksonCodec,JsonJackson在序列化有双向引用的对象时,会出现无限循环异常。而fastjson在检查出双向引用后会自动用引用符$ref替换,终止循环。

在我的情况中,我序列化了一个service,这个service已被spring托管,而且和另一个service之间也相互注入了,用fastjson能 正常序列化到redis,而JsonJackson则抛出无限循环异常。

为了序列化后的内容可见,所以不用redission其他自带的二进制编码器,自行实现编码器:

import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufOutputStream; import org.redisson.client.codec.BaseCodec; import org.redisson.client.protocol.Decoder; import org.redisson.client.protocol.Encoder;  import java.io.IOException;  public class FastjsonCodec extends BaseCodec {   private final Encoder encoder = in -&gt; {  ByteBuf out = ByteBufAllocator.DEFAULT.buffer();  try {  ByteBufOutputStream os = new ByteBufOutputStream(out);  JSON.writeJSONString(os, in,SerializerFeature.WriteClassName);  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) -&gt;  JSON.parseObject(new ByteBufInputStream(buf), Object.class);   @Override  public Decoder<object> getValueDecoder() {  return decoder;  }   @Override  public Encoder getValueEncoder() {  return encoder;  } }</object></object>

更多Redis相关技术文章,请访问Redis视频教程栏目进行学习!

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享