Protocol buffers protobuf 3中的非官方必填字段

Protocol buffers protobuf 3中的非官方必填字段,protocol-buffers,Protocol Buffers,我知道。 我正在考虑将Protobuf3用于文件格式,因为它具有高效的编码、明确的模式和广泛的支持。然而,模式中非常不方便的一部分是它不允许必填字段 谷歌有理由删除Protobuf3中的必填字段。他们遇到的问题是真实的(删除必填字段是一个突破性的改变),但他们的解决方案毫无意义 无论如何,我的问题是:Protobuf3允许您添加for字段。是否有人使用该方法(或其他方法)向Protobuf 3添加对必填字段的非正式支持?是否希望使用Protobuf对文件格式进行隐式验证,即如果数据中不存在必填字

我知道。

我正在考虑将Protobuf3用于文件格式,因为它具有高效的编码、明确的模式和广泛的支持。然而,模式中非常不方便的一部分是它不允许必填字段

谷歌有理由删除Protobuf3中的必填字段。他们遇到的问题是真实的(删除必填字段是一个突破性的改变),但他们的解决方案毫无意义


无论如何,我的问题是:Protobuf3允许您添加for字段。是否有人使用该方法(或其他方法)向Protobuf 3添加对必填字段的非正式支持?

是否希望使用Protobuf对文件格式进行隐式验证,即如果数据中不存在必填字段,是否希望文件解析失败?如果是这样,您可以使用,如果您试图从不存在的字段中读取这些字段的值,则会触发错误。

是否希望使用Protobuf对文件格式进行隐式验证,即如果数据中不存在所需字段,是否希望文件解析失败?如果是这样,您可以使用,如果您试图从不存在的字段中读取它们的值,则会触发错误。

支持注释来执行此操作

  • (gogoproto.nullable)=false
    生成不可为空的字段类型
  • (rust.nullable)=false
    将一个OFS生成为不可为空(反序列化失败)
  • (rust.err\u if_default\u或_unknown)=true
    将枚举生成为不可归零(反序列化失败)
    • 支持注释来完成此操作

      • (gogoproto.nullable)=false
        生成不可为空的字段类型
      • (rust.nullable)=false
        将一个OFS生成为不可为空(反序列化失败)
      • (rust.err\u if_default\u或_unknown)=true
        将枚举生成为不可归零(反序列化失败)

      不,我想要一种实际注释
      .proto
      文件的方法,说明“此字段是必需的”。理想情况下,我可以使用一个支持它的修改过的Protobuf库。或者至少使用一个支持它的外部工具来验证protobuf数据是否包括那些必需的字段。该字段的Like数据必须存在于文件中吗?这是Protobuf3中的默认行为,因为所有字段始终以其默认值存在。也许您可以给出这样一个字段的示例,以及您在读写文件时的预期行为?不,默认情况下,所有字段都是可选的。您可能会感到困惑,因为缺少的基本体字段被设置为默认值。请参阅。设置和发送它们是可选的,但它们将始终位于已解析的对象中,因为未设置的字段和已设置为默认值的字段之间不再存在差异。从应用程序的角度来看,所有集合都将始终被设置。这与Protobuf2通过按要求声明所有字段得到的保证是一样的,它是解析器的属性。我说的是二进制格式。完全可以编写一个Protobuf解码器来指示原语字段是否存在或默认。在任何情况下,您都完全忽略了消息字段。不,我想要一种实际注释
      .proto
      文件的方法,即“此字段是必需的”。理想情况下,我可以使用一个支持它的修改过的Protobuf库。或者至少使用一个支持它的外部工具来验证protobuf数据是否包括那些必需的字段。该字段的Like数据必须存在于文件中吗?这是Protobuf3中的默认行为,因为所有字段始终以其默认值存在。也许您可以给出这样一个字段的示例,以及您在读写文件时的预期行为?不,默认情况下,所有字段都是可选的。您可能会感到困惑,因为缺少的基本体字段被设置为默认值。请参阅。设置和发送它们是可选的,但它们将始终位于已解析的对象中,因为未设置的字段和已设置为默认值的字段之间不再存在差异。从应用程序的角度来看,所有集合都将始终被设置。这与Protobuf2通过按要求声明所有字段得到的保证是一样的,它是解析器的属性。我说的是二进制格式。完全可以编写一个Protobuf解码器来指示原语字段是否存在或默认。无论如何,您完全忽略了消息字段。