国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用java google protobuf遇到一個的小坑

tinysun1234 / 3149人閱讀

摘要:公司使用來作為通訊格式,一個同事這樣的寫法文件格式使用的時候這時候拿到的是一個要是改成這樣這時候拿到的是一個為什么會出現這種情況呢讀了源碼才知道是這樣處理的這里發現只要才會進行包裝,要不調用的是那么是什么時候變成不為呢繼續看代碼發現只要是調

公司使用protobuf來作為通訊格式,一個同事這樣的寫法
proto文件格式:

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

使用的時候:

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



這時候armies拿到的是一個java.util.Collections.unmodifiableList


要是改成這樣:

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

這時候armies拿到的是一個RepeatedFieldBuilder.list


為什么會出現這種情況呢?
讀了源碼才知道protobuf是這樣處理的:

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

這里發現只要curArmyBuilder_ == null才會進行包裝,要不調用的是curArmyBuilder_.getMessageList()
那么curArmyBuilder_ 是什么時候變成不為null呢?
繼續看代碼:

 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_;
  }

發現只要是調用了builder方法會改變curArmyBuilder_ 而curArmy_就會被變成null

遇到這種情況還是不要偷懶,老老實實的深復制吧,也許就會出現埋點很深的坑

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66349.html

相關文章

  • Google Protobuf 編解碼

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

    Eric 評論0 收藏0
  • netty 基于 protobuf 協議 實現 websocket 版本簡易客服系統

    摘要:結構作為服務端作為序列化數據的協議前端通訊演示地址服務端實現啟動類長連接示例主線程組從線程組請求的解碼和編碼把多個消息轉換為一個單一的或是,原因是解碼器會在每個消息中生成多個消息對象主要用于處理大數據流,比如一個大小的文件如果你直接傳輸肯定 結構 netty 作為服務端 protobuf 作為序列化數據的協議 websocket 前端通訊 演示 GitHub 地址 showImg(...

    wua_wua2012 評論0 收藏0

發表評論

0條評論

tinysun1234

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<