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; } }
更多Redis相關技術文章,請造訪Redis入門教學欄位進行學習!
以上是redisson如何序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!