<
>

Netty序列化深入理解与使用

2022-08-01 13:12:55 来源:易采站长站 作者:

目录
序列化与反序列化序列化模式其他对象序列化方式使用json协议实现对象的传输MessagePack编码器在Netty框架中使用

序列化与反序列化

序列化:把对象转换成字节的过程,称为对象序列化

反序列化:把字节恢复成对象的过程,称为反序列化

    对象的持久化概念:把字节保存的硬盘上永久的存放网络传输对象概念:客户端将对象序列化为字节(序列化),变成二进制的形式发送到服务器端端,服务器端接受到字节对象后,反序列化成对象

    注意序列化的类必须要实现>

    网络传输过程中不能直接传输对象,TCP协议的底层是二进制。

    序列化模式

    1.对象持久化概念:将对象转换成字节,存放到硬盘或者是数据库中

    2.>

    其他对象序列化方式

    1、将对象转换成json类型,实现跨语言

    客户端将对象转换程json类型,传递给服务器端序列化。

    服务器端获取到json,>

    2、Xml类型

    一般比较重量级,一般只有银行、保险公司使用这种方式。

    3、ProtoBuf(谷歌第三方协议,谷歌自定义协议)

    4、MessagePack

    也属于json里面的

    使用json协议实现对象的传输

    就是将对象转换成json字符串进行传输。

    MessagePack编码器

    它像JSON,>

    MessagePack是一种高效的二进制序列化格式。它允许您在JSON等多种语之间交换数据,但它更快速更小巧。小整数被编码为单个字节,典型的短字符串除了字符串本身之外只需要一个额外的字节。

    支持Python、Ruby、 Java、 C/C++ 等众多语言。宣称比Google Protocol Buffers还要快4倍。。

    使用案例:

    引入mave依赖:

    <dependency>
        <groupId>org.msgpack</groupId>
        <artifactId>msgpack</artifactId>
        <version>0.6.12</version>
    </dependency>
    

    基本api使用:

     // 创建MessagePack
    MessagePack messagePack = new MessagePack();
    MsgEntity meite = new MsgEntity(UUID.randomUUID().toString(), "kaico学习");
    // 序列化
    byte[] bs = messagePack.write(meite);
    Value read1 = messagePack.read(bs);
    System.out.println(read1);
    // 反序列化
    MsgEntity read = messagePack.read(bs, MsgEntity.class);
    System.out.println(read);
    

    在Netty框架中使用

    编码器

    public class MsgpackEncoder extends MessageToByteEncoder {
        /**
         * 对我们数据实现编码
         *
         * @param channelHandlerContext
         * @param msg
         * @param byteBuf
         * @throws Exception
         */
        @Override
        protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, ByteBuf byteBuf) throws Exception {
            MessagePack msgpack = new MessagePack();
            byteBuf.writeBytes(msgpack.write(msg));
        }
    }

    解码器

    public class MsgpackDecoder extends MessageToMessageDecoder<ByteBuf> {
        /**
         * 服务器解码数据
         *
         * @param channelHandlerContext
         * @param byteBuf
         * @param list
         * @throws Exception
         */
        @Override
        protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
            final int length = byteBuf.readableBytes();
            byte[] b = new byte[length];
            byteBuf.getBytes(byteBuf.readerIndex(), b, 0, length);
            MessagePack msgpack = new MessagePack();
            list.add(msgpack.read(b));
        }
    }

    服务端使用

    socketChannel.pipeline().addLast(new MsgpackDecoder());
    socketChannel.pipeline().addLast(new ServerHandler());
    

    客户端使用

    ch.pipeline().addLast(new MsgpackEncoder());
    ch.pipeline().addLast(new ClientHandler());
    

    到此这篇关于Netty序列化深入理解与使用的文章就介绍到这了,更多相关Netty序列化内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

暂时禁止评论

微信扫一扫

易采站长站微信账号