【问题标题】:What's an enum's value if it's required but not in range?如果需要但不在范围内,枚举的值是多少?
【发布时间】:2012-01-30 08:10:29
【问题描述】:

应用程序 A 使用这个 proto 文件

message The_message
{
   enum The_enum
   {
      one = 1;
      two = 2;
   }

   required The_enum the_enum = 1;
}

应用程序 B 使用文件的下一个版本。类似,只是多了一个枚举字段

three = 3;

如果应用程序 B 使用 three 枚举向应用程序 A 发送消息会发生什么?

protobuf documentation 说

如果您尝试提供不同的值,解析器会将其视为未知字段

所以枚举three 成为一个未知字段。如果the_enum 是可选的,那会很好,但它是必填字段。
应用程序 A 能否正确解析消息?
枚举不应该以这种方式扩展吗?

【问题讨论】:

  • C# 和 C++ 的答案可能会有所不同,不过我不了解 Java。
  • 在 Java 中大概是 null,因为枚举是真正的对象。 (从未使用过协议缓冲区。)
  • 你试过了吗?文档不清楚,所以我会认为这是“自己尝试一下,看看会发生什么”,尽管它可能会导致@StephenC 的回答如下。
  • @M.Babcock 我的特定用例是 C++ 和 C# 应用程序相互通信。但它没有理由不能与 Java 应用程序对话。我正在寻找协议的行为,而不是特定实现的行为。它可能是未定义的,这很好(我知道我不能可移植地扩展所需的枚举定义)。

标签: java c++ protocol-buffers


【解决方案1】:

我希望解析器的行为方式与遇到缺少required 字段的消息相同。我希望解析器拒绝该消息。

您链接到的页面是这样说的:

必填是永远的 - 您应该非常小心地将字段标记为必填。如果在某些时候您希望停止编写或发送必填字段,则将该字段更改为可选字段会出现问题 - 老读者会认为没有此字段的消息不完整,可能会无意中拒绝或丢弃它们。

现在这不是您所说的场景,但这意味着缺少必需的消息将导致该消息不被接受。


如果枚举类型的字段不是required,则文档暗示该字段将被视为未知字段。如果您使用的是支持它的 protobuf API 版本,则可以访问此字段/值,但您会将其视为字节或其他内容,而不是映射的 Java 或 C# enum 类型。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2014-12-20
    相关资源
    最近更新 更多