【发布时间】:2016-11-10 16:22:39
【问题描述】:
假设我有一个原型定义为:
MyProto {
optional MyWrapper wrapper = 1;
}
地点:
MyWrapper {
repeated int32 data = 1;
}
当我在 MyProto 的两个文本规范上调用 MergeFromString 时,包装器内重复字段的两个版本被连接起来(一个附加到另一个。)我真的希望它们被覆盖。 MergeFromString 的文档说:
当我们在 |serialized| 中找到一个字段时已经存在于此 留言:
- 如果它是“重复”字段,我们将追加到列表的末尾。
- 否则,如果它是一个标量,我们将覆盖我们的字段。
- 否则,(这是一个不重复的组合),我们递归合并 到现有的复合材料中。
显然,对于包装器,我们谈论的是第三种情况。所以我们递归地合并,在下一次复飞中,我们看到一个重复的字段,并且值被附加到目标。所以我明白为什么会这样了。
将此与MergeFrom 的规范进行比较:
此方法将指定消息的内容合并到 当前消息。在指定消息中设置的奇异字段 覆盖当前消息中的相应字段。重复 附加字段。奇异子消息和组是递归的 合并。
在这种情况下,包装器字段不是单个字段吗,包装器不会被覆盖吗?
所以我的问题是双重的,
1) 这是不一致的,还是我误解了什么?
2) 当我调用MergeFromString 时,如何获得我想要的覆盖而不是合并重复字段的行为?
【问题讨论】:
标签: c++ protocol-buffers