Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 覆盖protobuf MergeFrom vs.MergeFromString中的重复字段_C++_Protocol Buffers - Fatal编程技术网

C++ 覆盖protobuf MergeFrom vs.MergeFromString中的重复字段

C++ 覆盖protobuf MergeFrom vs.MergeFromString中的重复字段,c++,protocol-buffers,C++,Protocol Buffers,假设我有一个proto定义为: MyProto { optional MyWrapper wrapper = 1; } 其中: MyWrapper { repeated int32 data = 1; } 当我对MyProto的两个文本规范调用MergeFromString时,包装器中重复字段的两个版本被连接在一起(一个附加到另一个)。我确实希望它们被覆盖。MergeFromString的文档说明: 当我们在| serialized |中找到一个字段时,该字段已经存在于 信息

假设我有一个proto定义为:

MyProto {
    optional MyWrapper wrapper = 1;
}
其中:

MyWrapper {
    repeated int32 data = 1;
}
当我对
MyProto
的两个文本规范调用
MergeFromString
时,包装器中重复字段的两个版本被连接在一起(一个附加到另一个)。我确实希望它们被覆盖。
MergeFromString
的文档说明:

当我们在| serialized |中找到一个字段时,该字段已经存在于 信息:

  • 如果是“重复”字段,则将其追加到列表的末尾
  • 否则,如果它是标量,则覆盖字段
  • 否则,(这是一个不重复的复合),我们递归合并 到现有的组合中
显然,有了包装纸,我们谈论的是第三种情况。所以我们递归地合并,在下一个循环中,我们看到一个重复的字段,值被附加到目标上。所以我明白为什么会这样

将其与
MergeFrom
的规范进行比较:

此方法将指定消息的内容合并到 当前消息。在指定消息中设置的单个字段 覆盖当前邮件中的相应字段。重复的 字段被追加。单数子消息和组是递归的 合并

在这种情况下,包装器字段不是单个字段吗?包装器不会被覆盖吗

所以我的问题是双重的

1) 这是不一致的,还是我误解了什么


2) 调用
MergeFromString
时,如何获得所需的重写行为,而不是合并重复的字段

对于问题的第一部分,您引用的
MergeFrom
规范在技术上是正确的,尽管措辞有点混乱。它表示“单数字段”被覆盖,但“单数子消息”被递归合并,并且您的包装器将被视为单数子消息- 信息


要获得您想要的行为,您应该能够使用。特别是,您可以调用
FieldMaskUtil::MergeMessageTo(…)
并传递一个
MergeOptions
,该选项配置为替换重复的字段,而不是连接它们。要做到这一点,您首先必须从两条消息的文本格式表示中解析它们。

但是字段掩码util只在消息中存在的重复字段上工作,而不在子消息中工作messages@faizan你找到办法了吗?