我希望合并两个相同类型的复杂proto对象protoA和protoB,如果在这两个对象中都设置了一个字段,则应该在得到的proto中设置protoB的值。
我可以使用.mergeFrom()函数:
protoA.toBuilder().mergeFrom(protoB).build()但是根据文档,重复的字段将被连接起来。
mergeFrom(Message ):(仅用于构建器)将其他内容合并到此消息中,覆盖奇异标量字段,合并复合字段,并连接重复字段。
我不想要这种行为。是否有一种比手动设置每个重复字段更好的方法来做到这一点?
发布于 2021-06-10 16:20:48
在protobuf的FieldMaskUtil中,有一个合并覆盖现有字段的选项。
它有一个MergeOptions,您可以在其中配置setReplaceRepeatedFields(true);,它将protoB合并到protoA中,当重复使用protoB字段时。
我会给你写一个例子:
FieldMaskUtil.MergeOptions options =
new FieldMaskUtil.MergeOptions().setReplaceRepeatedFields(true);
// Now we get all the names of the fields in your proto
List<String> names = YourObjectProto.YourObject.getDescriptor().getFields()
.stream().map(Descriptors.FieldDescriptor::getName)
.collect(Collectors.toList());
FieldMaskUtil.merge(FieldMaskUtil.fromStringList(names),
protoB, protoA.toBuilder(),options);https://stackoverflow.com/questions/67921459
复制相似问题