Netty(三)——编解码之路

博客介绍了Netty中常用的三种编解码框架:MessagePack, Google Protobuf和Jboss Marshalling。MessagePack以其高效、小型化和跨语言支持受到青睐;Google Protobuf以其成熟度、小码流、高性能和跨语言支持等特点著称;Jboss Marshalling是对Java默认序列化的优化,保持兼容性并提供额外配置。文章通过具体代码示例展示了如何在Netty中实现这三种编解码技术。" 133957875,8204070,Android 13.0 锁屏禁止下拉状态栏实现解析,"['Android开发', '系统UI', '锁屏功能', '状态栏交互', '通知管理']
摘要由CSDN通过智能技术生成

       我们在开发中经常会把Java类进行implements Serializable用来网络传输的序列化和反序列化,过程其实就是将Java对象转编码为字节数组或者ByteBuffer对象进行传输,当远程服务读取到ByteBuffer对象或者字节数组时,需要将其解码为Java对象。这也就是编解码技术。

       Java的序列化只是编解码技术中的一种,但是由于其1,不支持跨语言;2,序列化后的码流相对较大(Java.io.Serializable序列化相对于基于BuyeBuffer的二进制编码的码流大小大概为5:1);3,性能相对来说较差(Java序列化只有二进制编码的大概6%)。业界出现了很多编解码的框架,我们来看看我们选择一款编解码框架时需要考虑的东西:

       1,是否支持跨语言,支持的语言种类是否丰富(现在跨系统、跨语言的交互太多了);

       2,编码后的码流大小(码流越大,存储占空间、网络传输更占带宽、吞吐量越低);

       3,编解码的性能;

       4,类库是否小巧,API使用是否方便;

       5,使用者需要手工开发的工作量和难度。

 

       好,下边讲述三种业界比较流行,而且Netty支持,通过Netty编程来实现的编解码框架;

       一,MessagePack编解码:MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.(官方解释)。它具有a,编解码高效、性能高;b,序列化之后码流小;c,支持跨语言(Java、Python、Ruby、C#、Lua、Go、C、C++……)

         好,看下MessagePack编解码的几个重要点:1,利用MessagePack实现编码和解码的ChannelHandlerAdapter;2,server和client端,initChannel时将编解码ChannelHandler添加到pipeline;3,支持粘包半包操作:LengthFieldBasedFrameDecoder、LengthFieldPrepender的加入。重点代码如下:

/**
 * @author liujiahan
 * @Title: MsgpackDecoder
 * @Copyright: Copyright (c) 2018
 * @Description: 利用MessagePack解码 MessageToMessageDecoder<I> extends ChannelHandlerAdapter
 * @Created on 2018/10/24
 * @ModifiedBy:
 */
public class MsgpackDecoder extends MessageToMessageDecoder<ByteBuf> {

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        final byte[] array;
        final int length = byteBuf.readableBytes();
        array = new byte[length];
        byteBuf.getBytes(byteBuf.readerIndex(),array,0,length);
        MessagePack messagePack = new MessagePack();
        list.add(messagePack.read(array));
    }
}



/**
 * @author liujiahan
 * @Title: MsgpackEncoder
 * @Copyright: Copyright (c) 2018
 * @Description: 利用MessagePack编码 MessageToByteEncoder<I> extends ChannelHandlerAdapter
 * @
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值