Netty ByteBuf到byte []解码器

问题描述 投票:0回答:1

我想将传入的Netty的ButeBuf消息转换为我的一类MyBuffer实例。为此,我使用这个MessageToMessageDecoder

class ByteArrayDecoder extends MessageToMessageDecoder<ByteBuf> {
  @Override
  protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
    int length = msg.readableBytes();
    if (msg.hasArray()) {
      out.add(new MyBuffer(msg.array(), msg.arrayOffset(), length));

    } else {
      byte[] bytes = new byte[length];
      msg.getBytes(msg.readerIndex(), bytes);
      out.add(new MyBuffer(bytes, 0, length));
    }
  }
}

现在,因为ByteBuf消息被引用计数,所以我们必须在完成它之后释放它。这是由我们正在扩展的MessageToMessageDecoder自动完成的。

既然ButeBuf已经发布了,这是否意味着后备阵列存在危险?它将被回收,我不知道我将在MyBuffer的数组中看到什么。

这个解码器是否可以安全使用,这是写它的正确方法吗?

java netty
1个回答
2
投票

根据@Ferrybig的建议,我的评论是答案!

ByteBuf.array()返回您指定的实际后备数组...

一旦你放弃了对它的句柄/引用,并且引用计数随后下降到0(立即或当其他一切都放弃其声明时),所有的赌注都将被取消。

如果你需要维护缓冲区中的内容,那么你的MyBuffer必须在它的构造函数中获取它接收的数组的副本。

在我最初使用它之后,当一个阵列被重新调整用途时,我一直被这种方式所困扰。当我回到它 - 繁荣 - 它已被重用,我的数据消失了。

所以可能值得为MyBuffer的构造函数添加一个“copy”标志,指示入站数组是否需要复制。

© www.soinside.com 2019 - 2024. All rights reserved.