gpt4 book ai didi

c++ - 覆盖 protobuf MergeFrom 与 MergeFromString 中的重复字段

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:54 25 4
gpt4 key购买 nike

假设我有一个定义为:

MyProto {
optional MyWrapper wrapper = 1;
}

哪里:

MyWrapper {
repeated int32 data = 1;
}

当我在 MyProto 的两个文本规范上调用 MergeFromString 时,包装器内重复字段的两个版本被连接起来(一个附加到另一个。)我真的希望它们被覆盖。 MergeFromString 的文档说:

When we find a field in |serialized| that is already present in this message:

  • If it's a "repeated" field, we append to the end of our list.
  • Else, if it's a scalar, we overwrite our field.
  • Else, (it's a nonrepeated composite), we recursively merge into the existing composite.

很明显,对于包装器,我们正在讨论第三种情况。所以我们递归地合并,在下一次循环中,我们看到一个重复的字段,并且值被附加到目标。所以我明白为什么会这样了。

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

This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.

那样的话,wrapper 字段不就是一个单一的字段吗,wrapper 不会被覆盖吗?

所以我的问题有两个方面,

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

2) 当我调用 MergeFromString 时,如何获得我想要的覆盖而不是合并重复字段的行为?

最佳答案

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

要获得所需的行为,您应该能够使用 FieldMaskUtil .特别是,您可以调用 FieldMaskUtil::MergeMes​​sageTo(...) 并传递配置为替换重复字段而不是连接它们的 MergeOptions。为此,您首先必须从文本格式表示中解析这两条消息。

关于c++ - 覆盖 protobuf MergeFrom 与 MergeFromString 中的重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40532380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com