摘要:公司使用來作為通訊格式,一個同事這樣的寫法文件格式使用的時候這時候拿到的是一個要是改成這樣這時候拿到的是一個為什么會出現(xiàn)這種情況呢讀了源碼才知道是這樣處理的這里發(fā)現(xiàn)只要才會進行包裝,要不調(diào)用的是那么是什么時候變成不為呢繼續(xù)看代碼發(fā)現(xiàn)只要是調(diào)
公司使用protobuf來作為通訊格式,一個同事這樣的寫法
proto文件格式:
message PlayerFightQueue { optional int32 fightQueueId = 1; repeated CurArmy curArmy = 2; }
使用的時候:
PlayerFightQueue.Builder fightQueue= getPlayerFightQueue(); Listarmies = fightQueue.getCurArmyList(); 這時候armies拿到的是一個java.util.Collections.unmodifiableList
要是改成這樣:
PlayerFightQueue.Builder fightQueue= getPlayerFightQueue(); fightQueue.getCurArmyBuilderList(); Listarmies = fightQueue.getCurArmyList(); 這時候armies拿到的是一個RepeatedFieldBuilder.list
為什么會出現(xiàn)這種情況呢?
讀了源碼才知道protobuf是這樣處理的:
public java.util.ListgetCurArmyList() { if (curArmyBuilder_ == null) { return java.util.Collections.unmodifiableList(curArmy_); } else { return curArmyBuilder_.getMessageList(); } }
這里發(fā)現(xiàn)只要curArmyBuilder_ == null才會進行包裝,要不調(diào)用的是curArmyBuilder_.getMessageList()
那么curArmyBuilder_ 是什么時候變成不為null呢?
繼續(xù)看代碼:
public java.util.ListgetCurArmyBuilderList() { return getCurArmyFieldBuilder().getBuilderList(); } private com.google.protobuf.RepeatedFieldBuilder< com.wl.protocol.rpc.msg.CurArmyMsg.CurArmy, com.wl.protocol.rpc.msg.CurArmyMsg.CurArmy.Builder, com.wl.protocol.rpc.msg.CurArmyMsg.CurArmyOrBuilder> getCurArmyFieldBuilder() { if (curArmyBuilder_ == null) { curArmyBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< com.wl.protocol.rpc.msg.CurArmyMsg.CurArmy, com.wl.protocol.rpc.msg.CurArmyMsg.CurArmy.Builder, com.wl.protocol.rpc.msg.CurArmyMsg.CurArmyOrBuilder>( curArmy_, ((bitField0_ & 0x00000080) == 0x00000080), getParentForChildren(), isClean()); curArmy_ = null; } return curArmyBuilder_; }
發(fā)現(xiàn)只要是調(diào)用了builder方法會改變curArmyBuilder_ 而curArmy_就會被變成null
遇到這種情況還是不要偷懶,老老實實的深復制吧,也許就會出現(xiàn)埋點很深的坑
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66349.html
摘要:優(yōu)點在谷歌內(nèi)部長期使用產(chǎn)品成熟度高跨語言支持多種語言包括和編碼后的消息更小更加有利于存儲和傳輸編解碼的性能非常高支持不同協(xié)議版本的前向兼容支持定義可選和必選字段的入門是一個靈活高效結(jié)構(gòu)化的數(shù)據(jù)序列化框架相比與等傳統(tǒng)的序列化工具它更小更快更簡 Google Protobuf 優(yōu)點: 在谷歌內(nèi)部長期使用, 產(chǎn)品成熟度高. 跨語言、支持多種語言, 包括 C++、Java 和 Python....
摘要:結(jié)構(gòu)作為服務(wù)端作為序列化數(shù)據(jù)的協(xié)議前端通訊演示地址服務(wù)端實現(xiàn)啟動類長連接示例主線程組從線程組請求的解碼和編碼把多個消息轉(zhuǎn)換為一個單一的或是,原因是解碼器會在每個消息中生成多個消息對象主要用于處理大數(shù)據(jù)流,比如一個大小的文件如果你直接傳輸肯定 結(jié)構(gòu) netty 作為服務(wù)端 protobuf 作為序列化數(shù)據(jù)的協(xié)議 websocket 前端通訊 演示 GitHub 地址 showImg(...
閱讀 2081·2023-04-25 17:48
閱讀 3590·2021-09-22 15:37
閱讀 2943·2021-09-22 15:36
閱讀 6016·2021-09-22 15:06
閱讀 1646·2019-08-30 15:53
閱讀 1438·2019-08-30 15:52
閱讀 720·2019-08-30 13:48
閱讀 1130·2019-08-30 12:44