簡體   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