Netty 编写ByteBuf和普通Java对象之间的区别

Netty 编写ByteBuf和普通Java对象之间的区别,netty,netty4,Netty,Netty4,我注意到,在使用Netty时,可以编写另一个数据,即ByteBuff实例或普通Java对象 如图所示 在你的档案上 HAProxyMessage message = new HAProxyMessage( HAProxyProtocolVersion.V2, HAProxyCommand.PROXY, HAProxyProxiedProtocol.TCP4, "12

我注意到,在使用Netty时,可以编写另一个数据,即
ByteBuff
实例或普通Java对象

如图所示

在你的档案上

HAProxyMessage message = new HAProxyMessage(
                    HAProxyProtocolVersion.V2, 
                    HAProxyCommand.PROXY, HAProxyProxiedProtocol.TCP4,
                    "127.0.0.1", 
                    "127.0.0.2", 
                    8000, 
                    9000
);

ch.writeAndFlush(message).sync();
其中一个普通Java对象,
HAProxyMessage
被写入上下文。仍在同一文件中,您有:

ch.writeAndFlush(Unpooled.copiedBuffer("Hello World!", CharsetUtil.US_ASCII)).sync();
其中
unmooled.copiedBuffer
用于创建要写入的数据。此方法返回一个
ByteBuf


接下来的问题是:编写(或读取)plan Java对象和
ByteBuf

之间有什么实质性区别(如果有),当您编写ByteBuf时,消息不需要任何转换。 当它是Java对象时,您需要一个编码器/解码器。 这里有以下内容:

  • 编码器:
  • 解码器:
它们将Java对象转换为ByteBuf(编码器)或反向(解码器)

使用其中一种的方式取决于您当前的情况:

  • 您是否管理Java对象?可能有一个编解码器(编码器/解码器)是一个好方法
  • 您是否管理简单数据(ByTestStream、简单值…)?也许直接由特百福管理是一个好办法。 这些并不是唯一需要决定的相关问题

但最后,在Netty中,所有内容都是ByteBuf。

编写ByteBuf时,消息不需要任何转换。 当它是Java对象时,您需要一个编码器/解码器。 这里有以下内容:

  • 编码器:
  • 解码器:
它们将Java对象转换为ByteBuf(编码器)或反向(解码器)

使用其中一种的方式取决于您当前的情况:

  • 您是否管理Java对象?可能有一个编解码器(编码器/解码器)是一个好方法
  • 您是否管理简单数据(ByTestStream、简单值…)?也许直接由特百福管理是一个好办法。 这些并不是唯一需要决定的相关问题

但最后,在Netty中,一切都是一场闹剧。

我明白了。因此,如果我需要说,写一些像新行一样的东西。将其转换为byte[]数组可能比用ByteBuf包装更有效?是不是?ByteBuf的巨大优势在于它能够积累各种资源。例如,从字节数组中,使用wrapped ByteBuf,并添加一些字节,使用复合ByteBuf,或反向创建可能最终大小的ByteBuf,并将所有内容写入其中。其主要思想是尽可能限制内存复制,一般来说,包装和使用ByteBufs的组合是最好的。但一般来说,这意味着当然也有例外。在内部,Netty需要ByteBuf,因此无论您使用什么Java对象(甚至字节数组),最终都必须使用ByteBuf。感谢您的响应。我知道ByteBuf有不同的实现方式。您是否碰巧知道Netty内部使用的默认值……因此,在编写像byte[]这样简单的内容的情况下,这取决于协议。例如,当大小已知且消息是从各种源生成时,ByteBuf分配一次并从各种源写入(这往往具有连续的内部字节数组,因此效率更高,但代价是多个副本)。另一个例子是,当源被限制为一个字节数组(或多个字节数组,如您的示例中所示)时,为了防止复制,我们使用wrappedBuffers(array1、array2、array3),这往往以非连续内存访问的价格限制复制。然而,最后,一切都需要ByteBuf。此外,Netty使用了一种强大而高效的算法来分配、重用和缓冲内存,因此ByteBuf的原因是。如果只有一个字节数组(或2个,一个用于实际数据,另一个用于固定的“\n”.getBytes(),则可以使用WrappedBuffer。但是如果可以将此字节数组直接构建到ByteBuf中,则效果会更好,因为“您的”因此,在包装字节数组时,它不是由Netty的内存池管理的。我明白了。因此,如果我需要说写一些类似换行符的内容,请将其转换为字节[]数组可能比用ByteBuf包装更有效?或者不是?ByteBuf的巨大优势在于它能够累积各种数据源。例如,从字节数组开始,使用wrapped ByteBuf,然后添加一些字节,使用复合ByteBuf,或者反过来创建一个可能最终大小的ByteBuf并将所有内容写入其中。其主要思想是限制尽可能多的内存拷贝,一般来说,包装和使用ByteBuf的组合是最好的。但通常意味着当然也有例外。在内部,Netty需要ByteBuf,因此无论您使用什么Java对象(甚至字节数组)最后,我不得不求助于ByteBuf。感谢您的回复。我知道ByteBuf有不同的实现方式。您是否碰巧知道Netty内部使用的默认实现方式……因此,举个简单的例子,比如byte[]正在写入?这实际上取决于协议。例如,当大小已知且消息是从各种源生成时,ByteBuf分配一次并从各种源写入(这往往具有连续的内部字节数组,因此效率更高,但代价是多个副本)。另一个示例是,当源限制为一个字节数组(或多个字节数组,如您的示例中所示)时,为了防止复制,我们使用wrappedBuffers(array1、array2、array3),这往往会以不连续内存访问的价格限制复制。但是,最后,所有内容都需要ByteBuf。此外,Netty使用了一种强大而高效的算法来分配、重用和缓冲内存,这就是ByteBuf的原因。如果您只有一个字节数组(或2,一个用于实际数据,另一个用于固定的“\n”.getBytes(),可以使用WrappedBuffer。但是如果可以将此字节数组直接构建到