diff --git a/redisson/src/main/java/org/redisson/codec/FuryCodec.java b/redisson/src/main/java/org/redisson/codec/FuryCodec.java index 652d331da..6e0a21f9e 100644 --- a/redisson/src/main/java/org/redisson/codec/FuryCodec.java +++ b/redisson/src/main/java/org/redisson/codec/FuryCodec.java @@ -17,13 +17,10 @@ package org.redisson.codec; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufInputStream; -import io.netty.buffer.ByteBufOutputStream; import org.apache.fury.Fury; import org.apache.fury.ThreadSafeFury; import org.apache.fury.config.FuryBuilder; import org.apache.fury.config.Language; -import org.apache.fury.io.FuryStreamReader; import org.apache.fury.memory.MemoryBuffer; import org.apache.fury.memory.MemoryUtils; import org.redisson.client.codec.BaseCodec; @@ -32,7 +29,6 @@ import org.redisson.client.protocol.Decoder; import org.redisson.client.protocol.Encoder; import java.io.IOException; -import java.nio.ByteBuffer; /** * Apache Fury codec @@ -92,7 +88,7 @@ public class FuryCodec extends BaseCodec { try { return fury.deserialize(furyBuffer); } finally { - buf.writerIndex(buf.writerIndex() + furyBuffer.writerIndex()); + buf.readerIndex(buf.readerIndex() + furyBuffer.readerIndex()); } } }; @@ -101,14 +97,22 @@ public class FuryCodec extends BaseCodec { @Override public ByteBuf encode(Object in) throws IOException { ByteBuf out = ByteBufAllocator.DEFAULT.buffer(); - try { - ByteBufOutputStream baos = new ByteBufOutputStream(out); - fury.serialize(baos, in); - return baos.buffer(); - } catch (Exception e) { - out.release(); - throw e; + MemoryBuffer furyBuffer; + int remainingSize = out.capacity() - out.writerIndex(); + if (out.hasArray()) { + furyBuffer = MemoryUtils.wrap(out.array(), out.arrayOffset() + out.writerIndex(), + remainingSize); + } else { + furyBuffer = MemoryUtils.buffer(out.memoryAddress() + out.writerIndex(), remainingSize); + } + int size = furyBuffer.size(); + fury.serialize(furyBuffer, in); + if (furyBuffer.size() > size) { + out.writeBytes(furyBuffer.getHeapMemory(), 0, furyBuffer.size()); + } else { + out.writerIndex(out.writerIndex() + furyBuffer.writerIndex()); } + return out; } };