检查协议缓冲区 3 中是否设置了字段

新手上路,请多包涵

我正在将 Java 应用程序从协议缓冲区 2 迁移到协议缓冲区 3。

在 proto 2 中检查是否设置了一个字段你有 hasfield() 方法,生成的示例 Java 代码是:

 public boolean hasText() {
  return ((bitField0_ & 0x00000004) == 0x00000004);
}

但是在 proto 3 中它已被删除。你如何检查一个字段是否已在 proto 3 中设置?

原文由 user1798617 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 479
1 个回答

这里 给出了一种建议的方法:

 # NOTE: As of proto3, HasField() only works for message fields, not for
#       singular (non-message) fields. First try to use HasField and
#       if it fails (with a ValueError) we manually consult the fields.
try:
    return message_pb.HasField(property_name)
except ValueError:
    all_fields = set([field.name for field in message_pb._fields])
    return property_name in all_fields

另外,从同一页面:

在 proto3 中,标量字段的字段存在根本不存在。您对 proto3 的心理模型应该是它是 C++ 或 Go 结构。对于整数和字符串,没有设置或不设置这样的东西,它总是有一个值。对于子消息,它是指向可以为 NULL 的子消息实例的指针,这就是为什么您可以测试它是否存在。

原文由 P.W 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题