gpt4 book ai didi

java - Netty ByteBuf 到 byte[] 解码器

转载 作者:行者123 更新时间:2023-12-02 01:34:48 24 4
gpt4 key购买 nike

我想将传入的 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 的构造函数中添加一个“复制”标志,指示入站数组是否需要复制。

关于java - Netty ByteBuf 到 byte[] 解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55381323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com