[英]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.