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 分享