我遇到了一些关于更改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列表。 例如:
更新第一个UnitInfo的第一个DateUnit的日期= 2.
使用默认值向Info添加新的UnitInfo。
起初, 我想我可以获取列表然后更新它。
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'来简单替换。
当然这很有用。但我相信必须有更好的方法来更新消息中重复类型的值。 如果某人有好主意或对我的情况有疑问,请留言给我。 期待任何人的回复:)