写 ByteBuf 和普通 Java 对象的区别

Difference between writing a ByteBuf and an ordinary Java Objects

我注意到在使用 Netty 时可以写入其他 ByteBuff 或普通 Java 对象的实例数据。

可以看出HAProxyClient

在那个文件上你有

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();

其中Unpooled.copiedBuffer用于创建要写入的数据。这个方法returns一个ByteBuf.

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

之间的 material 区别(如果有)是什么

当你写一个ByteBuf时,消息不需要任何转换。 当它是一个 Java 对象时,你需要一个 encoder/decoder。 这里有以下内容:

他们将 Java 对象转换为 ByteBuf(编码器)或反向(解码器)。

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

  • 你管理过Java对象吗?可能有一个编解码器 (Encoder/Decodec) 是个好方法。
  • 您是否管理过简单数据(字节流、简单值...)?可能直接管理 ByteBuf 是一个好方法。 这些不是唯一要决定其中之一的相关问题。

但最后,在 Netty 中,一切都是 ByteBuf。