摘要:我們在使用對對象數(shù)據(jù)進(jìn)行序列化的時(shí)候,發(fā)現(xiàn)序列化以后的二進(jìn)制數(shù)組數(shù)據(jù)偏大的情況??疾煜旅娴拇a我們會(huì)發(fā)現(xiàn),針對這個(gè)萬個(gè)對象的的序列化后的數(shù)據(jù)達(dá)到了。如果我們再定義對象的時(shí)候添加一部分參數(shù),我們會(huì)發(fā)現(xiàn)大小將會(huì)有顯著改善。
我們在使用?MessagePack 對 List 對象數(shù)據(jù)進(jìn)行序列化的時(shí)候,發(fā)現(xiàn)序列化以后的二進(jìn)制數(shù)組數(shù)據(jù)偏大的情況。
請注意,不是所有的 List 對象都會(huì)出現(xiàn)這種情況,這個(gè)根據(jù)你 List 對象中存儲(chǔ)的內(nèi)容有關(guān)。
有關(guān)本問題的測試源代碼請參考:https://github.com/cwiki-us-d...?中的內(nèi)容。
考察下面的代碼:
ListdataList = MockDataUtils.getMessageDataList(600000); ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory()); raw = objectMapper.writeValueAsBytes(dataList); FileUtils.byteCountToDisplaySize(raw.length); logger.debug("Raw Size: [{}]", FileUtils.byteCountToDisplaySize(raw.length));
我們會(huì)發(fā)現(xiàn),針對這個(gè) 60 萬個(gè)對象的 List 的序列化后的數(shù)據(jù)達(dá)到了 33MB。
如果我們再定義??ObjectMapper 對象的時(shí)候添加一部分參數(shù),我們會(huì)發(fā)現(xiàn)大小將會(huì)有顯著改善。
請參考下面的代碼:
ListdataList = MockDataUtils.getMessageDataList(600000); ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory()); objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); objectMapper.setAnnotationIntrospector(new JsonArrayFormat()); rawJsonArray = objectMapper.writeValueAsBytes(dataList); logger.debug("rawJsonArray Size: [{}]", FileUtils.byteCountToDisplaySize(rawJsonArray.length));
如果你運(yùn)行上面的代碼,你會(huì)看到程序的輸出字符串將會(huì)降低到 23MB。
這里面主要是?objectMapper.setAnnotationIntrospector(new JsonArrayFormat());?這句話起了作用。
在正常的場景中,我們可以通過 注解 JsonIgnore, 將其加到屬性上,即解析時(shí)即會(huì)過濾到屬性。
而實(shí)際實(shí)現(xiàn),則是由類?JacksonAnnotationIntrospector?中 的?hasIgnoreMarker?來完成,則就是通過讀取注解來判斷屬性是否應(yīng)該被exclude掉。ObjectMapper中默認(rèn)的?AnnotationIntrospector?即是?JacksonAnnotationIntrospector?來完成,但我們可以通過 方法?ObjectMapper.setAnnotationIntrospector?來重新指定自定義的實(shí)現(xiàn)。
https://www.cwiki.us/display/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76015.html
摘要:完整的步驟如下檢查比特幣或的余額,錢包地址。比特幣的到帳時(shí)間是個(gè)塊的高度,約分鐘。 showImg(https://segmentfault.com/img/remote/1460000018952144?w=1200&h=659); 方案一: 通過ExinCore API進(jìn)行幣幣交易 Exincore 提供了基于Mixin Network的幣幣交易API. 你可以支付USDT給Exi...
摘要:完整的步驟如下檢查比特幣或的余額,錢包地址。比特幣的到帳時(shí)間是個(gè)塊的高度,約分鐘。 showImg(https://segmentfault.com/img/remote/1460000018952144?w=1200&h=659); 方案一: 通過ExinCore API進(jìn)行幣幣交易 Exincore 提供了基于Mixin Network的幣幣交易API. 你可以支付USDT給Exi...
摘要:是一個(gè)高效的二進(jìn)制序列化框架它像一樣支持不同語言間的數(shù)據(jù)交換但是它的性能更快序列化之后的碼流更小的特點(diǎn)如下編解碼高效性能高序列化之后的碼流小支持跨語言編碼器和解碼器開發(fā)編碼器開發(fā)負(fù)責(zé)將類型的對象編碼為數(shù)組然后添加到集合中解碼器開發(fā)首先從數(shù) MessagePack 是一個(gè)高效的二進(jìn)制序列化框架, 它像 JSON 一樣支持不同語言間的數(shù)據(jù)交換, 但是它的性能更快, 序列化之后的碼流更小. ...
摘要:自然,設(shè)備還會(huì)通知多個(gè)傳感器的值和機(jī)器的狀態(tài)。然而的字符數(shù)較多,數(shù)據(jù)量較大?;谖锫?lián)網(wǎng)服務(wù)處理這些格式時(shí),要把文本數(shù)據(jù)轉(zhuǎn)換成數(shù)值數(shù)據(jù)和二進(jìn)制數(shù)據(jù)。因此,雖然這種數(shù)據(jù)格式不方便人們直接閱讀,但計(jì)算機(jī)卻能很容易地處理。 嵌入式開發(fā)中其實(shí)最重要的就是數(shù)據(jù)傳輸,這部分由于頻繁的使用,高效的格式和算法...
摘要:支持等眾多語言。此處的是經(jīng)過封裝的,和中類似。相關(guān)模板均在類中定義,諸如。優(yōu)化后的使用方法為中的錯(cuò)誤先看看這段代碼反序列化后獲取,因?yàn)橹惺穷愋?,這里面可能是,也可能是,因此需要注意。參考資料讓版支持類型 Msgpack簡介 MessagePack is an efficient binary serialization format. It lets you exchange data...
閱讀 1053·2021-11-22 13:53
閱讀 1602·2021-11-17 09:33
閱讀 2406·2021-10-14 09:43
閱讀 2872·2021-09-01 11:41
閱讀 2282·2021-09-01 10:44
閱讀 2928·2021-08-31 09:39
閱讀 1459·2019-08-30 15:44
閱讀 1869·2019-08-30 13:02