什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用?
哈喽!大家好,我是小奇,一位热爱分享的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新
一、前言
书接上回,昨天下雨没怎么上街上溜达,今天是个大晴天,准备去街上看看老头下象棋,毕竟我的象棋技术在我们人才村也排的上号的。我去给他们指点指点。.
走到街上竟然看不到下象棋的,我就纳闷了,这么好的天怎么可能没有大爷出来下象棋呢,难道大娘刚刚拿着扫帚过来扫荡过?

这时我看到路边狗蛋他们几个在玩玻璃球,他们几个平时在村里属于小间谍了,村里发生了什么肯定门清。

我:狗蛋,你们几个今天看见大爷下象棋了吗?
狗蛋:看见了,现在大爷估计正下的激烈着呢。
我:在哪呢?我怎么没看见。
狗蛋:走,我回家骑上我的坐骑带你去。

我:狗蛋大哥,咱先等会,你看这狗眼睛都压的睁不开了,咱还是走着去吧。
狗蛋:走。
狗蛋带领着我走了七八条街道,拐了十几个弯,都快走到镇上了,终于看到了我们村里下棋的大爷们了。

我:大爷啊,咱们下个棋怎么跑这么远,再走两步就出国了。。。
大爷:没办法啊,你大娘新买了一个大扫帚,打人可疼了呢,必须得跑远点。
我:得,那你们先下,谁输了就换我。
正当我给大爷支招,让他用车蹩对方的象眼的时候,我的手机响了。
我:“喂您好”。
对面:“您好,请问是小奇吗”。
我:“是我,你是?”。
对面:“我是XXX公司的,我看到hr推给我你的简历,我感觉还不错,你什么时候方便来现场面试一下”。
我:“现在不方便现场面试了”。
对面:“好吧,那你现在方便吗?我们现在线上面试一下吧”。
我:“好的”。
二、面试
面试官:我看你简历上写的精通Netty,那你能简单说什么是Netty编解码吗?
我:当我们使用Netty发送或者接收一个消息的时候,就会发生一次编码或者解码,比如我们接收外部传过来的消息,我们会将消息解码,如果发送消息,我们会将消息(例如java对象)编码成二进制发送出去,因为消息在真正传输的过程中是通过二进制格式来传输的。
面试官:Netty有哪些编解码器呢?
我:Netty提供了很多编解码器,比如对字符串编码的StringEncoder,对字符串解码的StringDecoder,对对象编码的ObjectEncoder和对对象解码的ObjectDecoder。
面试官:这些编解码器我感觉效率有点低,有没有什么效率更高的编解码器呢?
我:我们可以使用protostuff,protostuff是一个基于protobuf实现的序列化方法,他可以在损耗极低的性能情况下做到序列化。
面试官:protostuff具体怎么使用呢?
我:首先引入依赖。
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff‐api</artifactId>
<version>1.0.10</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff‐core</artifactId>
<version>1.0.10</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff‐runtime</artifactId>
<version>1.0.10</version>
</dependency>
我:然后新建一个序列化工具类。
public class ProtostuffUtil {
private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();
private static <T> Schema<T> getSchema(Class<T> clazz) {
@SuppressWarnings("unchecked")
Schema<T> schema = (Schema<T>) cachedSchema.get(clazz);
if (schema == null) {
schema = RuntimeSchema.getSchema(clazz);
if (schema != null) {
cachedSchema.put(clazz, schema);
}
}
return schema;
}
我:编写序列化反序列化方法。
/**
* 序列化
*
* @param obj
* @return
*/
public static <T> byte[] serializer(T obj) {
@SuppressWarnings("unchecked")
Class<T> clazz = (Class<T>) obj.getClass();
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
try {
Schema<T> schema = getSchema(clazz);
return ProtostuffIOUtil.toByteArray(obj, schema, buffer);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
}
}
/**
* 反序列化
*
* @param data
* @param clazz
* @return
*/
public static <T> T deserializer(byte[] data, Class<T> clazz) {
try {
T obj = clazz.newInstance();
Schema<T> schema = getSchema(clazz);
ProtostuffIOUtil.mergeFrom(data, obj, schema);
return obj;
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
面试官:“小伙子不错呀,什么时候能回北京入职呢”
我:“额。。。等等吧,现在还有好多家公司等着谈薪资呢,我得挑一家合适的。”
面试官:“你要多少我都给你,来我这吧”
我:“额。。。那就月薪100个W吧”。
面试官:“喂,你说什么我听不见,信号不好。。。”
我:“喂喂喂”(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。
三、总结
这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
如果觉得我的文章还不错的话就点个赞吧
什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用?的更多相关文章
- Netty 编解码技术 数据通信和心跳监控案例
Netty 编解码技术 数据通信和心跳监控案例 多台服务器之间在进行跨进程服务调用时,需要使用特定的编解码技术,对需要进行网络传输的对象做编码和解码操作,以便完成远程调用.Netty提供了完善,易扩展 ...
- 【转】Netty系列之Netty编解码框架分析
http://www.infoq.com/cn/articles/netty-codec-framework-analyse/ 1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称 ...
- Netty系列之Netty编解码框架分析
1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decod ...
- Netty 编解码奥秘
Netty中编解码 Netty 的解码器有很多种,比如基于长度的,基于分割符的,私有协议的.但是,总体的思路都是一致的. 拆包思路:当数据满足了 解码条件时,将其拆开.放到数组.然后发送到业务 han ...
- Netty学习(九)-Netty编解码技术之Marshalling
前面我们讲过protobuf的使用,主流的编解码框架其实还有很多种: ①JBoss的Marshalling包 ②google的Protobuf ③基于Protobuf的Kyro ④Apache的Thr ...
- Netty编解码技术
编解码技术,说白了就是java序列化技术,序列化目的就两个,第一进行网络传输,第二对象持久化. 虽然我们可以使用java进行对象序列化,netty去传输,但是java序列化的硬伤比较多,比如java序 ...
- Netty编解码技术和UDP实现
背景 作为网络传输框架,免不了传输对象,对象在传输之前就要序列化,这个序列化的过程就是编码过程.接收到编码后的数据就需要解码,还原传输的数据. 编解码技术就是java序列化技术,序列化的目的有两个,一 ...
- Netty学习(七)-Netty编解码技术以及ProtoBuf和Thrift的介绍
在前几节我们学习过处理粘包和拆包的问题,用到了Netty提供的几个解码器对不同情况的问题进行处理.功能很是强大.我们有没有去想这么强大的功能是如何实现的呢?背后又用到了什么技术?这一节我们就来处理这个 ...
- netty: 编解码之jboss marshalling, 用marshalling进行对象传输
jboss marshalling是jboss内部的一个序列化框架,速度也十分快,这里netty也提供了支持,使用十分方便. TCP在网络通讯的时候,通常在解决TCP粘包.拆包问题的时候,一般会用以下 ...
随机推荐
- Jar 包下载以及 maven jar 包配置
学习内容: jar包下载是我们必须掌握的一个内容,不管是使用Maven项目还是其他项目,一般都需要引入外部的 jar 包 jar包下载 下载地址(打不开网址的直接百度搜索 maven reposito ...
- Idea导出jar包和使用自定义API
自定义jar简单实现案例 学习内容 1. 自定义工具类 2. 导出jar 3. 加载Jar包 4. 调用自定义的API方法 总结 学习内容 1. 自定义工具类 新建一个java项目,然后创建包和工具类 ...
- for 循环详解
学习目标: 掌握 for 循环的使用 学习内容: 1.for语法 for(初始化语句; boolean表达式; 循环后操作语句) { 循环体; } 流程图如下: 特点: 初始化语句:只在循环开始时执行 ...
- vue引入echarts
效果图: 1.安装Echarts : npm install echarts -S 或者使用国内的淘宝镜像: 安装: npm install -g cnpm --registry=https: ...
- 如何利用PowerShell完成的Windows服务器系统安全加固实践和基线检测
0x00 前言简述 最近单位在做等保测评,由本人从事安全运维方面的工作(PS:曾经做过等保等方面的安全服务),所以自然而然的与信安的测评人员一起对接相关业务系统的检查,在做主机系统测评检查时发现了系统 ...
- Java学习day27
今天跟着做了一个模拟龟兔赛跑的程序 只有一条赛道,乌龟和兔子在同一条赛道上比赛,使用了多线程 为了实现兔子睡觉,在run方法内增加了当前奔跑者是否是兔子的判断且当前奔跑步数是否是10的整数倍的判断,如 ...
- OpenHarmony标准设备应用开发(三)——分布式数据管理
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 邢碌 上一章,我们通过分布式音乐播放器.分布式炸弹.分布式购物车,带大家讲解了 OpenAtom OpenHarmon ...
- git 将本地文件推送到远程分支的分支
1. 新建文件夹复制远程分支 2. 切换到远程分支 3. 推送到远程 添加到暂存区,先运行 " git add . " 查看文件状态 在运 ...
- 【FAQ】HMS Core推送服务与本地创建通知消息如何相互覆盖?
我们知道,单独使用HMS Core推送服务或本地创建通知消息,都可以实现通知消息的覆盖,方式分别为: 1.本地创建通知消息(简称本地通知消息) 通过notificationManager.notify ...
- v-show与v-if的一次事故
v-show等同于设置dom元素的display为none,dom元素没有消失而是被隐藏了 v-if是删除或添加dom元素,频繁地删除和添加dom元素会比较耗费性能