如何在子字段

时间:2017-07-01 16:07:16

标签: java protocol-buffers

我遇到了一些关于更改protobuff消息中的值的问题。 这是原型文件。

message Info {
  repeated InfoUnit unit = 1;  
}
message InfoUnit {
  optional uint64 id = 1;
  repeated DateUnit date_unit = 2;
}
message DateUnit {
  optional uint64 date = 1;
}

我的任务很简单。我收到一条信息消息,然后更新Info的InfoUnit列表。 例如:

  1. 更新第一个UnitInfo的第一个DateUnit的日期= 2.

  2. 使用默认值向Info添加新的UnitInfo。

  3. 起初, 我想我可以获取列表然后更新它。

    Info.Builder builder = infoMessage.toBuilder();
    List<InfoUnit> list = builder.getInfoUnitList();
    //first infoUnit, first dataUnit, 2
    update(list.get(0), 0, 2);
    list.add(InfoUnit.newBuilder()...........build())
    

    但最终这不起作用。

    我在本网站找到了解释:Making a small change to a Java protocol buffers object

    我不明白,我找不到解决这个问题的好方法。

    所以我改为新计划,但这很复杂。

    Info.Builder builder = infoMessage.toBuilder();
    //copy the builder list
    List<InfoUnit.Builder> builderList = new ArrayList<InfoUnit>(builder.getInfoUnitBuilderList());
    
    //finish update and add
    update(....);
    
    //clear the InfoUnit list
    builder.clearInfouNIT();
    //rebuild the list
    for(InfoUnit.Builder infoUnitBuilder: builderList)
        builder.addInfoUnit(infoUnitBuilder);
    //rebuild this Info
    builder.build();
    

    我将InfoUnit的构建器列表复制到更新,然后清除以前的InfoUnit列表并使用该副本重建InfoUnit列表。 您可能会发现DataUnit也是一个列表,因此我再次执行此操作。我不在这里写DataUnit的更新代码,只需使用'update'来简单替换。

    当然这很有用。但我相信必须有更好的方法来更新消息中重复类型的值。 如果某人有好主意或对我的情况有疑问,请留言给我。 期待任何人的回复:)

0 个答案:

没有答案