摘要:序列化工具類序列化工具的序列化與反序列化使用實現序列化和反序列化反序列化時,必須要有默認構造函數,否則報錯使用序列化緩存此類分別包含序列化序列化序列化三種序列化方式。
序列化工具類
序列化即將對象序列化為字節數組,反序列化就是將字節數組恢復成對象。
主要的目的是方便傳輸和存儲。
序列化工具類:
public class SerializeUtil { private static Map, Schema>> cachedSchema = new ConcurrentHashMap<>(); private static Objenesis objenesis = new ObjenesisStd(true); /** * jdk 序列化工具的序列化與反序列化 * * @param object * @return * @throws IOException */ public static byte[] JDKObjectToBytes(Object object) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutput objectOutput = new ObjectOutputStream(byteArrayOutputStream); objectOutput.writeObject(object); return byteArrayOutputStream.toByteArray(); } public static T JDKBytesToObject(byte[] bytes, Class clazz) throws Exception { ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes)); Object object = objectInputStream.readObject(); return (T) object; } /** * 使用fastjson實現序列化和反序列化 * * @param object * @return */ public static byte[] FastJsonObjectToBytes(Object object) { byte[] bytes = JSON.toJSONBytes(object); return bytes; } /** * fastjosn反序列化時,class必須要有默認構造函數,否則報錯 * @param bytes * @param clazz * @param * @return */ public static T FastJsonBytesToObject(byte[] bytes, Class clazz) { return (T) JSON.parseObject(bytes, clazz); } /** * 使用protostuff序列化 * @param obj * @param * @return */ public static byte[] serialize(T obj) { Class cls = (Class ) obj.getClass(); LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); try { Schema schema = getSchema(cls); return ProtostuffIOUtil.toByteArray(obj, schema, buffer); } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); } finally { buffer.clear(); } } public static T deserialize(byte[] data, Class cls) { try { T message = objenesis.newInstance(cls); Schema schema = getSchema(cls); ProtostuffIOUtil.mergeFrom(data, message, schema); return message; } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); } } /** * 緩存schema * @param cls * @param * @return */ private static Schema getSchema(Class cls) { Schema schema = (Schema ) cachedSchema.get(cls); if (schema == null) { schema = RuntimeSchema.createFrom(cls); if (schema != null) { cachedSchema.put(cls, schema); } } return schema; } }
此類分別包含jdk序列化、fastjson序列化、protobuf序列化三種序列化方式。
注意prostuff需要包含maven依賴:
使用org.objenesis objenesis 2.6 io.protostuff protostuff-core 1.4.0 io.protostuff protostuff-runtime 1.4.0 com.alibaba fastjson 1.2.31
首先定義一個類用于測試,注意此類沒有默認構造函數。
public class Monster implements Serializable{ Integer hp; Integer mp; String name; Integer level; public Monster(String name,Integer level){ this.name=name; this.level=level; } //省略getter、setter、hashCode、equals... }
測試類:
public class SerializeUtilTest { Monster monster = new Monster("boss", 100); Class clazz = Monster.class; @Test public void jdkSerializeTest() throws Exception { byte[] bytes = SerializeUtil.JDKObjectToBytes(monster); System.out.println(bytes.length); Monster object = SerializeUtil.JDKBytesToObject(bytes,clazz); Assert.assertEquals(object, monster); } @Test(expected = com.alibaba.fastjson.JSONException.class) public void fastJsonSerializeTest(){ byte[] bytes = SerializeUtil.FastJsonObjectToBytes(monster); System.out.println(bytes.length); Monster object = SerializeUtil.FastJsonBytesToObject(bytes,clazz); Assert.assertEquals(object, monster); } @Test public void serialize(){ byte[] serialize = SerializeUtil.serialize(monster); System.out.println(serialize.length); Object deserialize = SerializeUtil.deserialize(serialize, clazz); Assert.assertEquals(deserialize,monster); } }
輸出分別為199、27、8。
可以看出jdk默認序列化方式的效率極低,protobuf效率和字節都非常高效。
特別注意:fastjson反序列化的對象必須要有默認構造函數,否則會報錯。protostuff使用objenesis不需要默認構函數創建對象。但是json格式可讀性好,性能也還可以,推薦性能不高的場景優先json格式,對性能要求高的場景使用protostuff。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67490.html
摘要:在中,對象的序列化與反序列化被廣泛應用到遠程方法調用及網絡傳輸中。相關接口及類為了方便開發人員將對象進行序列化及反序列化提供了一套方便的來支持。未實現此接口的類將無法使其任何狀態序列化或反序列化。 序列化與反序列化 序列化 (Serialization)是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。一般將一個對象存儲至一個儲存媒介,例如檔案或是記億體緩沖等。在網絡傳輸過程中,可以...
摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...
摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。目錄一基礎篇二進階篇三高級篇四架構篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...
摘要:回到的第二方法的用法,通過上面的分析,我們可以知道,方法其實也是用來獲取泛型的實際類型的,這樣就可以將響應反序列化為帶泛型的類型了。在很多反序列化的開源組件中,都用了這個原理例如的方法,所以我們會經常見到實例化的時候會多個花括號。 前段日子在使用google-http-client.jar 這個組件做http請求時,發現一件有趣的事情,具體代碼如下: try { ...
閱讀 3540·2023-04-25 20:41
閱讀 2671·2023-04-25 16:40
閱讀 1438·2021-09-23 11:44
閱讀 1259·2021-09-10 10:51
閱讀 1688·2021-09-07 09:59
閱讀 1653·2019-12-27 12:08
閱讀 560·2019-08-30 15:44
閱讀 3341·2019-08-30 11:08