Netty序列化深入理解与使用
作者:kaico2018 发布时间:2023-05-24 20:13:07
序列化与反序列化
序列化:把对象转换成字节的过程,称为对象序列化
反序列化:把字节恢复成对象的过程,称为反序列化
对象的持久化概念:把字节保存的硬盘上永久的存放
网络传输对象概念:客户端将对象序列化为字节(序列化),变成二进制的形式发送到服务器端端,服务器端接受到字节对象后,反序列化成对象
注意序列化的类必须要实现 Serializable 接口, transient 修饰变量使得该变量不被序列化。
网络传输过程中不能直接传输对象,TCP协议的底层是二进制。
序列化模式
1.对象持久化概念:将对象转换成字节,存放到硬盘或者是数据库中
2. 网络传输对象概念:客户端将对象转成字节的形式(序列化)、变成二进制的形式发送给服务器端,服务器端接受到字节之后,反序列化成对象(rpc 远程通讯)。
其他对象序列化方式
1、将对象转换成json类型,实现跨语言
客户端将对象转换程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());
来源:https://blog.csdn.net/weixin_44044929/article/details/123948587


猜你喜欢
- 简介本文用示例介绍SpringBoot如何向容器注册bean(即:将对象加入容器)。法1:@Component(@Controller/@S
- 实现Android 滑动退出Activity的功能android向右滑动,退出activity//右滑删除 compile &
- IDE的下载和安装:首先,到visual studio官网下载vs2019的安装程序。学生、或个人开发者免费下载第一个community版本
- 一、前言先使用一个模板图片,在图片上添加图片或者文字都可以。二、依赖<dependency> <
- 侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑
- 实例:用户输入一个日期,要求输出这个日期是星期几和在这一年中的第几天://声明一个DateTime类型的变量用于存放用户输入的日期DateT
- 一、概述1、事务ACID特性事务将一系列的工作视为一个工作单元,它具有 ACID 特性:A:Atomicity 不可分性 也就是说
- 本文主要介绍了关于c#和java base64不一致的解决方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧不一致的问题不
- 前言《飞机大战-I》是一款融合了街机、竞技等多种元素的经典射击手游。华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你
- 实践仿照@EnableEurekaServer实现自动装配如果你使用过Eureka作为微服务的注册中心,那么对@EnableWebConfi
- 引入线程是为了减少程序在并发执行时所付出的时空开销。属性:轻型实体。它不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。独立调度和
- protobuf 是 google的一个开源项目,可用于以下两种用途:(1)数据的存储(序列化和反序列化),类似于xml、json等;(2)
- 首先我们要明白一下几点,1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为没有一成不变的代码,需求变化代码就不可避免的要变化。
- feign调用服务时参数内容过大场景前端参数传入到gateway后,gateway使用feign调用服务时,传入的参数内容过大(参数常见于富
- 一. 可变字符串1. 简介在Java中,我们除了可以通过String类创建和处理字符串之外,还可以使用StringBuffer和String
- 该篇文章是说明在Android手机或平板电脑中如何实现截取当前屏幕的功能,并把截取的屏幕保存到SDCard中的某个目录文件夹下面。实现的代码
- SpringBootTest单元测试报错@RunWith(SpringRunner.class)@SpringBootTest(classe
- break和continue的说明break 循环结构,一旦执行,就结束(或跳出)当前循环结构,此关键字的后面,不能
- cron表达式每天整点执行一次的问题最近写了个发短信的定时任务,需求是每天上午10点发信息,然后我百度了一篇文章,复制了一个cron表达式:
- 场景发布微服务的操作一般都是打完新代码的包,kill掉在跑的应用,替换新的包,启动。spring cloud 中使用eureka为注册中心,