亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

使用java google protobuf遇到一個(gè)的小坑

tinysun1234 / 3234人閱讀

摘要:公司使用來(lái)作為通訊格式,一個(gè)同事這樣的寫(xiě)法文件格式使用的時(shí)候這時(shí)候拿到的是一個(gè)要是改成這樣這時(shí)候拿到的是一個(gè)為什么會(huì)出現(xiàn)這種情況呢讀了源碼才知道是這樣處理的這里發(fā)現(xiàn)只要才會(huì)進(jìn)行包裝,要不調(diào)用的是那么是什么時(shí)候變成不為呢繼續(xù)看代碼發(fā)現(xiàn)只要是調(diào)

公司使用protobuf來(lái)作為通訊格式,一個(gè)同事這樣的寫(xiě)法
proto文件格式:

message PlayerFightQueue {
    optional  int32      fightQueueId            = 1;
    repeated  CurArmy     curArmy                = 2;
}

使用的時(shí)候:

PlayerFightQueue.Builder fightQueue= getPlayerFightQueue();
List armies = fightQueue.getCurArmyList();



這時(shí)候armies拿到的是一個(gè)java.util.Collections.unmodifiableList


要是改成這樣:

PlayerFightQueue.Builder fightQueue= getPlayerFightQueue();
fightQueue.getCurArmyBuilderList();
List armies = fightQueue.getCurArmyList();

這時(shí)候armies拿到的是一個(gè)RepeatedFieldBuilder.list


為什么會(huì)出現(xiàn)這種情況呢?
讀了源碼才知道protobuf是這樣處理的:

  public java.util.List getCurArmyList() {
    if (curArmyBuilder_ == null) {
      return java.util.Collections.unmodifiableList(curArmy_);
    } else {
      return curArmyBuilder_.getMessageList();
    }
  }

這里發(fā)現(xiàn)只要curArmyBuilder_ == null才會(huì)進(jìn)行包裝,要不調(diào)用的是curArmyBuilder_.getMessageList()
那么curArmyBuilder_ 是什么時(shí)候變成不為null呢?
繼續(xù)看代碼:

 public java.util.List 
       getCurArmyBuilderList() {
    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方法會(huì)改變curArmyBuilder_ 而curArmy_就會(huì)被變成null

遇到這種情況還是不要偷懶,老老實(shí)實(shí)的深復(fù)制吧,也許就會(huì)出現(xiàn)埋點(diǎn)很深的坑

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66349.html

相關(guān)文章

  • Google Protobuf 編解碼

    摘要:優(yōu)點(diǎn)在谷歌內(nèi)部長(zhǎng)期使用產(chǎn)品成熟度高跨語(yǔ)言支持多種語(yǔ)言包括和編碼后的消息更小更加有利于存儲(chǔ)和傳輸編解碼的性能非常高支持不同協(xié)議版本的前向兼容支持定義可選和必選字段的入門(mén)是一個(gè)靈活高效結(jié)構(gòu)化的數(shù)據(jù)序列化框架相比與等傳統(tǒng)的序列化工具它更小更快更簡(jiǎn) Google Protobuf 優(yōu)點(diǎn): 在谷歌內(nèi)部長(zhǎng)期使用, 產(chǎn)品成熟度高. 跨語(yǔ)言、支持多種語(yǔ)言, 包括 C++、Java 和 Python....

    Eric 評(píng)論0 收藏0
  • netty 基于 protobuf 協(xié)議 實(shí)現(xiàn) websocket 版本簡(jiǎn)易客服系統(tǒng)

    摘要:結(jié)構(gòu)作為服務(wù)端作為序列化數(shù)據(jù)的協(xié)議前端通訊演示地址服務(wù)端實(shí)現(xiàn)啟動(dòng)類(lèi)長(zhǎng)連接示例主線程組從線程組請(qǐng)求的解碼和編碼把多個(gè)消息轉(zhuǎn)換為一個(gè)單一的或是,原因是解碼器會(huì)在每個(gè)消息中生成多個(gè)消息對(duì)象主要用于處理大數(shù)據(jù)流,比如一個(gè)大小的文件如果你直接傳輸肯定 結(jié)構(gòu) netty 作為服務(wù)端 protobuf 作為序列化數(shù)據(jù)的協(xié)議 websocket 前端通訊 演示 GitHub 地址 showImg(...

    wua_wua2012 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<