Разница между записью ByteBuf и обычных объектов Java
Я заметил, что можно записывать другие данные, которые являются экземпляром
ByteBuff
или простые объекты Java при использовании Netty.
Как видно в 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
используется для создания записываемых данных. Этот метод возвращает.
Тогда возникает вопрос: какова материальная разница (если таковая имеется) между записью (или чтением) Java-объекта плана и
ByteBuf
1 ответ
Когда вы пишете ByteBuf, сообщение не требует преобразования. Когда это объект Java, вам нужен кодировщик/декодер. Здесь у вас есть следующее:
- Кодировщик: https://github.com/netty/netty/blob/a60825c3b425892af9be3e9284677aa8a58faa6b/codec-haproxy/src/main/java/io/netty/handler/codec/haproxy/HAProxyMessageEncoder.java
- Декодер: https://github.com/netty/netty/blob/a60825c3b425892af9be3e9284677aa8a58faa6b/codec-haproxy/src/main/java/io/netty/handler/codec/haproxy/HAProxyMessageDecoder.java
Они преобразуют объект Java в ByteBuf (кодировщик) или наоборот (декодер).
То, как вы хотите использовать тот или иной вариант, зависит от вашего текущего случая:
- вы управляли Java Object? Вероятно, наличие кодека (кодировщика/декодека) является хорошим способом.
- вы управляете простыми данными (поток байтов, простые значения...)? Вероятно, управление непосредственно ByteBuf — хороший способ. Это не единственные важные вопросы, которые необходимо решить в пользу того или иного.
Но, наконец, в Netty все является ByteBuf.