gpt4 book ai didi

protocol-buffers - has_field() 方法如何与 protobuf 中的默认值相关联?

转载 作者:行者123 更新时间:2023-12-03 11:23:22 24 4
gpt4 key购买 nike

我正在尝试确定 之间的关系默认值 has_foo() 在各种编程接口(interface)中声明的方法。特别是,我试图确定在什么情况下(如果有的话)您可以“区分”明确设置为默认值的字段和未设置的值。

  • 如果我明确地将一个字段(例如“Bar.foo”)设置为其默认值(例如零),那么 Bar::has_foo() 是否保证该数据结构返回 true? (从快速检查来看,这对于 C++ 生成的代码似乎是正确的,但这并不意味着它是有保证的。)如果这是真的,那么可以在序列化之前区分显式设置的默认值和未设置的值。
  • 如果我明确地将一个字段设置为其默认值(例如,零),然后将该对象序列化并通过网络发送,是否会发送该值?如果不是,那么显然任何接收此对象的代码都无法区分显式设置的默认值和未设置的值。即,序列化后将无法区分这两种情况—— Bar::has_foo() 在这两种情况下都将返回 false。

  • 如果无法区分,如果我想编码“可为空”的可选值,推荐的编码 protobuf 字段的技术是什么?我想到了几个选项,但看起来都不是很好:(a)添加一个额外的 bool 字段来记录该字段是否设置,或者(b)使用“重复”字段,即使我在语义上想要一个可选字段 -这样我就可以区分无值(长度为零的列表)或设定值(长度为一的列表)。

    最佳答案

    以下适用于 'proto2' 语法,而不是 'proto3' :

    是否设置字段的概念是 Protobuf 的核心特性 .如果将一个字段设置为一个值(任意值),那么对应的 has_xxx方法必须返回 true,否则您的 API 中有错误。

    如果您没有设置字段然后序列化消息,则不会为该字段发送任何值。接收方将解析消息,发现包含哪些值,并设置相应的“has_xxx”值。

    此处记录了这是如何以有线格式实现的:http://code.google.com/apis/protocolbuffers/docs/encoding.html .简短的版本是消息被编码为一系列键值对,并且只有明确设置的字段才包含在编码的消息中。

    只有当您尝试读取未设置的字段时,默认值才会起作用。

    关于protocol-buffers - has_field() 方法如何与 protobuf 中的默认值相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9168052/

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