繁体   English   中英

Netty ByteBuf到byte []解码器

[英]Netty ByteBuf to byte[] decoder

我想将传入的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的数组中会看到什么。

此解码器安全使用吗,这是编写它的正确方法吗?

根据@Ferrybig的建议,我正在将我的评论作为答案!

ByteBuf.array()返回您指定的实际支持数组...

一旦您放弃了对它的处理/引用,并且引用计数随后下降到0(立即或当其他所有放弃其声明的时候),所有的赌注都关闭了。

如果需要维护缓冲区中的内容,则MyBuffer将必须获取在其构造函数中接收到的数组的副本。

在我最初使用数组后,将数组重新用作用途之前,我对此一直感到吃力。 当我回到繁荣时期时,它已经被重用,我的数据也消失了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM