首页 > 解决方案 > 资源内集合上的协议缓冲区字段掩码

问题描述

如果我想更新以下资源(协议缓冲区)中“f_units”集合中特定元素内的“金额”字段,FieldMask 将如何更新金额字段?字段掩码是否对集合的数组索引进行操作?

{
  "f_sel": {
    "f_units": [
      {
        "id": "1",
        "amount": {
          "coefficient": 1000,
          "exponent": -2
        }
      },
      {
        "id": "2",
        "amount": {
          "coefficient": 2000,
          "exponent": -2
        }
      }
    ]
  }
}

会是“f_sel.f_units.0.amount”吗?如何使用 FieldMask 更新金额?

标签: protocol-buffers

解决方案


据我所知,没有办法用 FieldMask 中的索引替换重复字段的单个元素。

相反,您需要更新 f_units 中要更改的元素的数量字段,并将 FieldMask 设置为

"f_sel.f_units"

只需将增量发送到原始列表会稍微更有效,但很难防止错误。例如,如果同时修改了 proto 并且重复字段的指定索引(假设有一种方法可以指定)不再在范围内怎么办?

顺便说一句,谷歌确实提出了 MergeOptions 的概念,它定义了合并时如何处理重复字段的语义。目前,他们似乎打算让您完全替换重复的字段或附加到目标字段的末尾。这两种合并策略都避免了上述可能由指定无效索引引起的错误。


推荐阅读