日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高性能的序列化与反序列化:kryo的简单使用

發(fā)布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高性能的序列化与反序列化:kryo的简单使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:kryo是個高效的java序列化/反序列化庫,目前Twitter、yahoo、Apache、strom等等在使用該技術(shù),比如Apache的spark、hive等大數(shù)據(jù)領(lǐng)域用的較多。

為什么使用kryo而不是其他?

因為性能足夠好。比kyro更高效的序列化庫就只有g(shù)oogle的protobuf了(而且兩者性能很接近),protobuf有個缺點就是要傳輸?shù)拿恳粋€類的結(jié)構(gòu)都要生成對應(yīng)的proto文件(也可以都放在同一個proto文件中,如果考慮到擴展性的話,不建議放在一個proto文件中),如果某個類發(fā)生修改,還得重新生成該類對應(yīng)的proto文件;另外考慮到項目中用的全部是java技術(shù)棧,不存在不同編程語言間的兼容性問題,因此最終采用了kryo作為序列化庫。

使用場景:(數(shù)據(jù)交換或數(shù)據(jù)持久化)比如使用kryo把對象序列化成字節(jié)數(shù)組發(fā)送給消息隊列或者放到redis等nosql中等等應(yīng)用場景。

注意:由于kryo不是線程安全的,針對多線程情況下的使用,要對kryo進行一個簡單的封裝設(shè)計,從而可以多線程安全的使用序列化和反序列化

序列化和反序列化接口設(shè)計

/*** 序列化工具(程序調(diào)用該接口來實現(xiàn)obj<->byte[]之間的序列化/反序列化)* @author eguid**/ public interface Serializer{/*** 序列化* @param t* @param bytes*/public void serialize(Object t,byte[] bytes);/*** 序列化* @param obj* @param bytes* @param offset* @param count*/public void serialize(Object obj, byte[] bytes, int offset, int count);/*** 反序列化* @param bytes -字節(jié)數(shù)組* @return T<T>*/public <T>T deserialize(byte[] bytes);/*** 反序列化* @param bytes* @param offset* @param count* @return*/public <T>T deserialize(byte[] bytes, int offset, int count);}

使用kryo實現(xiàn)上面的接口

/*** 基于kyro的序列化/反序列化工具* * @author eguid**/ public class kryoSerializer implements Serializer {// 由于kryo不是線程安全的,所以每個線程都使用獨立的kryofinal ThreadLocal<Kryo> kryoLocal = new ThreadLocal<Kryo>() {@Overrideprotected Kryo initialValue() {Kryo kryo = new Kryo();kryo.register(ct, new BeanSerializer<>(kryo, ct));return kryo;}};final ThreadLocal<Output> outputLocal = new ThreadLocal<Output>();final ThreadLocal<Input> inputLocal = new ThreadLocal<Input>();private Class<?> ct = null;public kryoSerializer(Class<?> ct) {this.ct = ct;}public Class<?> getCt() {return ct;}public void setCt(Class<?> ct) {this.ct = ct;}@Overridepublic void serialize(Object obj, byte[] bytes) {Kryo kryo = getKryo();Output output = getOutput(bytes);kryo.writeObjectOrNull(output, obj, obj.getClass());output.flush();}@Overridepublic void serialize(Object obj, byte[] bytes, int offset, int count) {Kryo kryo = getKryo();Output output = getOutput(bytes, offset, count);kryo.writeObjectOrNull(output, obj, obj.getClass());output.flush();}/*** 獲取kryo* * @param t* @return*/private Kryo getKryo() {return kryoLocal.get();}/*** 獲取Output并設(shè)置初始數(shù)組* * @param bytes* @return*/private Output getOutput(byte[] bytes) {Output output = null;if ((output = outputLocal.get()) == null) {output = new Output();outputLocal.set(output);}if (bytes != null) {output.setBuffer(bytes);}return output;}/*** 獲取Output* * @param bytes* @return*/private Output getOutput(byte[] bytes, int offset, int count) {Output output = null;if ((output = outputLocal.get()) == null) {output = new Output();outputLocal.set(output);}if (bytes != null) {output.writeBytes(bytes, offset, count);}return output;}/*** 獲取Input* * @param bytes* @param offset* @param count* @return*/private Input getInput(byte[] bytes, int offset, int count) {Input input = null;if ((input = inputLocal.get()) == null) {input = new Input();inputLocal.set(input);}if (bytes != null) {input.setBuffer(bytes, offset, count);}return input;}@SuppressWarnings("unchecked")@Overridepublic <T> T deserialize(byte[] bytes, int offset, int count) {Kryo kryo = getKryo();Input input = getInput(bytes, offset, count);return (T) kryo.readObjectOrNull(input, ct);}@Overridepublic <T> T deserialize(byte[] bytes) {return deserialize(bytes, 0, bytes.length);}

測試一下kryo的序列化和反序列化

為什么使用納秒,而不用毫秒?與java原生的序列化反序列化要耗時幾毫秒不同,kryo序列化和反序列化太快了,單個對象的序列化反序列化速度都在0.0x毫秒左右(如果電腦性能更好的話,會更快)

Serializer ser = new kryoSerializer(Msg.class);for (int i = 0; i < 10; i++) {Msg msg = new Msg();msg.setVersion_flag(new byte[] { 1, 2, 3 });msg.setCrc_code((short) 1);msg.setMsg_body(new byte[] { 123, 123, 123, 43, 42, 1, 12, 45, 57, 98 });byte[] bytes = new byte[300];long start = System.nanoTime();ser.serialize(msg, bytes);System.err.println("序列化耗時:" + (System.nanoTime() - start));System.out.println(msg);System.out.println(Arrays.toString(bytes));Msg newmsg = null;start = System.nanoTime();newmsg = ser.deserialize(bytes);System.err.println("反序列化耗時:" + (System.nanoTime() - start));System.out.println(newmsg);}----end----










轉(zhuǎn)載于:https://www.cnblogs.com/eguid/p/10195569.html

總結(jié)

以上是生活随笔為你收集整理的高性能的序列化与反序列化:kryo的简单使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。