什麼是Netty編解碼,Netty編解碼器有哪些?Protostuff怎麼使用?

2022-05-30 09:01:29

哈嘍!大家好,我是小奇,一位熱愛分享的程式設計師
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧
文章持續更新

一、前言

書接上回,昨天下雨沒怎麼上街上溜達,今天是個大晴天,準備去街上看看老頭下象棋,畢竟我的象棋技術在我們人才村也排的上號的。我去給他們指點指點。.

走到街上竟然看不到下象棋的,我就納悶了,這麼好的天怎麼可能沒有大爺出來下象棋呢,難道大娘剛剛拿著掃帚過來掃蕩過?

這時我看到路邊狗蛋他們幾個在玩玻璃球,他們幾個平時在村裡屬於小間諜了,村裡發生了什麼肯定門清。

我:狗蛋,你們幾個今天看見大爺下象棋了嗎?

狗蛋:看見了,現在大爺估計正下的激烈著呢。

我:在哪呢?我怎麼沒看見。

狗蛋:走,我回家騎上我的坐騎帶你去。

我:狗蛋大哥,咱先等會,你看這狗眼睛都壓的睜不開了,咱還是走著去吧。

狗蛋:走。

狗蛋帶領著我走了七八條街道,拐了十幾個彎,都快走到鎮上了,終於看到了我們村裡下棋的大爺們了。

我:大爺啊,咱們下個棋怎麼跑這麼遠,再走兩步就出國了。。。

大爺:沒辦法啊,你大娘新買了一個大掃帚,打人可疼了呢,必須得跑遠點。

我:得,那你們先下,誰輸了就換我。

正當我給大爺支招,讓他用車蹩對方的象眼的時候,我的手機響了。

我:「喂您好」。

對面:「您好,請問是小奇嗎」。

我:「是我,你是?」。

對面:「我是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吧」。

面試官:「喂,你說什麼我聽不見,訊號不好。。。」

我:「喂喂喂」(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。

三、總結

這裡的相關內容還沒有整理完畢,文章後面持續更新,建議收藏。

文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。

如果覺得我的文章還不錯的話就點個贊吧