哈嘍!大家好,我是小奇,一位熱愛分享的程式設計師
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧
文章持續更新
書接上回,昨天下雨沒怎麼上街上溜達,今天是個大晴天,準備去街上看看老頭下象棋,畢竟我的象棋技術在我們人才村也排的上號的。我去給他們指點指點。.
走到街上竟然看不到下象棋的,我就納悶了,這麼好的天怎麼可能沒有大爺出來下象棋呢,難道大娘剛剛拿著掃帚過來掃蕩過?
這時我看到路邊狗蛋他們幾個在玩玻璃球,他們幾個平時在村裡屬於小間諜了,村裡發生了什麼肯定門清。
我:狗蛋,你們幾個今天看見大爺下象棋了嗎?
狗蛋:看見了,現在大爺估計正下的激烈著呢。
我:在哪呢?我怎麼沒看見。
狗蛋:走,我回家騎上我的坐騎帶你去。
我:狗蛋大哥,咱先等會,你看這狗眼睛都壓的睜不開了,咱還是走著去吧。
狗蛋:走。
狗蛋帶領著我走了七八條街道,拐了十幾個彎,都快走到鎮上了,終於看到了我們村裡下棋的大爺們了。
我:大爺啊,咱們下個棋怎麼跑這麼遠,再走兩步就出國了。。。
大爺:沒辦法啊,你大娘新買了一個大掃帚,打人可疼了呢,必須得跑遠點。
我:得,那你們先下,誰輸了就換我。
正當我給大爺支招,讓他用車蹩對方的象眼的時候,我的手機響了。
我:「喂您好」。
對面:「您好,請問是小奇嗎」。
我:「是我,你是?」。
對面:「我是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吧」。
面試官:「喂,你說什麼我聽不見,訊號不好。。。」
我:「喂喂喂」(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。
這裡的相關內容還沒有整理完畢,文章後面持續更新,建議收藏。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧