4

什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用? - 旷世奇才927

 1 year ago
source link: https://www.cnblogs.com/xiaoqiJava/p/16325576.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

什么是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吧”。

面试官:“喂,你说什么我听不见,信号不好。。。”

我:“喂喂喂”(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK