MessageToByteEncoder框架可见用户使用POJO对象编码为字节数据存储到ByteBuf。用户只需定义自己的编码方法encode()即可。
首先看类签名:
1 | public abstract class MessageToByteEncoder<I> extends |
可知该类只处理出站事件,切确的说是write事件。
该类有两个成员变量,preferDirect表示是否使用内核的DirectedByteBuf,默认为true。TypeParameterMatcher用于检测泛型参数是否是期待的类型,比如说,如果需要编码String类的POJO对象,Matcher会确保write()传入的参数Object的实际切确类型为String。
直接分析write()的处理:
1 | public void write(ChannelHandlerContext ctx, Object msg, |
编码框架简单明了,再列出allocateBuffer()方法的代码:
1 | protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, I msg, |
总的来说,编码的复杂度大大小于解码的复杂度,这是因为编码不需考虑TCP粘包。编解码的处理还有一个常用的类MessageToMessageCodec用于POJO对象之间的转换。如果有兴趣,可下载源码查看。至此,编解码框架已分析完毕。
热评话题