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?->?{ ?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)?-> ?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