Protobuf3 枚举

定义消息类型时,您可能希望它的一个字段有一个预定义的值列表。例如,假设您希望为每个SearchRequest添加一个corpus字段,其中语料库可以是UNIVERSAL、WEB、IMAGES、LOCAL、NEWS、PRODUCTS 或VIDEO。您可以非常简单地通过在消息定义中添加枚举来实现这一点,每个可能的值都是一个常量。

在下面的例子中,我们添加了一个名为Corpus 的枚举和一个类型为Corpus的字段:

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

正如你所看到的,Corpus枚举的第一个常量映射到0,每个枚举定义必须包含一个映射到零的常量作为第一个元素。这是因为:

必须有零值,这样我们就可以使用0作为数值默认值。

零值必须为第一个元素,以便与proto 2语义兼容,其中第一个枚举值总是默认的。

可以通过为不同的枚举常量分配相同的值来定义别名。为此,您需要将allow_alias选项设置为true,否则协议编译器会在找到别名时生成错误消息。

enum EnumAllowingAlias {
  option allow_alias = true;
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;
}
enum EnumNotAllowingAlias {
  UNKNOWN = 0;
  STARTED = 1;
  // RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.
}

枚举数常量必须在32位整数的范围内。由于enum值在传输中使用不同的编码,负值效率低下,因此不推荐使用。您可以在消息定义中定义枚举,如上例所示,也可以在消息定义之外定义枚举——这些枚举可以在 .proto文件中的消息定义中重用。您也可以使用语法MessageType.EnumType,将一条消息中声明的枚举类型用作另一条消息中字段的类型

当你在.proto文件上使用枚举运行协议缓冲区编译器时,生成的代码将具有Java或c++的相应枚举,Python使用一个EnumDescriptor类,用于在运行时生成的类中创建一组具有整数值的符号常量。

在反序列化期间,无法识别的枚举值将保留在消息中,尽管反序列化消息时如何表示这些值取决于编程语言。在支持数值超出指定符号范围的开放式枚举类型的语言中,例如c++和Go,未知的枚举值简单地存储为其底层整数表示。在具有封闭枚举类型的语言(如Java)中,在枚举中无法识别的值可以用特殊的访问器访问。在任一种情况下,如果消息被序列化,则无法识别的值仍将与消息一起序列化。

有关如何在应用程序中使用消息枚举的详细信息,请参阅为您选择的语言生成的代码指南。

保留值

如果通过完全删除枚举条目或注释来更新枚举类型,将来的用户可以在对该类型进行自己的更新时重用数值。如果他们以后加载旧版本的相同 .proto内容,这可能会导致严重的问题。包括数据损坏、隐私漏洞等。确保不会发生这种情况的一种方法是指定保留已删除条目的数值(and/or名称,这也会导致JSON序列化问题)。如果将来有任何用户试图使用这些标识符,协议缓冲区编译器会报错。您可以使用max关键字指定保留的数值范围达到可能的最大值。

enum Foo {
  reserved 2, 15, 9 to 11, 40 to max;
  reserved "FOO", "BAR";
}

请注意,不能在同一保留语句中混合字段名和数值。

五.Protobuf3 枚举的更多相关文章

  1. C#基础(五)--枚举的含义及其应用

    本章讲解如下枚举的如下几个知识点:    1.什么是枚举?    2.枚举是值类型还是引用类型?    3.如何定义枚举?    4.枚举的好处?    5.枚举在实际系统开发过程中的用处?    一 ...

  2. 【swift学习笔记】五.使用枚举优雅的管理Segue

    在做页面转跳的时候,我们要给Segue命名,如果Segue多了,管理他们就是一个恶梦.我们可以枚举更优雅的管理这些Segue. 1.我们先来建立一个protocol,他的功能就是让实现类实现一个Seg ...

  3. Swift基础语法(五)枚举、结构体与类的区别

    swift中的结构体值可以是整型.浮点型.字符串.字符.元祖,如果不赋值默认为整型且从0开始计数,如果为整型枚举且要求不是从0开始只需指定枚举的第一个值以后的值自动依次加1 引用方式也与oc有所出入 ...

  4. 《Effective Java》读书笔记五(枚举和注解)

    No30 用enum代替int常量 一:综述 int枚举模式,示范: // The int enum pattern - severely deficient! public static final ...

  5. Objective-C 学习笔记(五) 快速枚举

    Objective-C 快速枚举 快速枚举是一个Objective-C的功能,有助于列举一个集合. 快速枚举语法 for (classType variable in collectionObject ...

  6. 复习java第五天(枚举、Annotation(注释) 概述)

    一.枚举 传统的方式: •在某些情况下,一个类的对象是有限而且固定的.例如季节类,只能有 4 个对象 •手动实现枚举类: —private 修饰构造器. —属性使用 private final 修饰. ...

  7. 十五.ProtoBuf3的基础总结

    转自: https://blog.csdn.net/u011518120/article/details/54604615 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 ...

  8. [Java核心技术]五-继承(枚举类)

    ####Java枚举类型(enum) 枚举类型都是继承了Enum类(是一个抽象类)的一个类,我们可以向enum类中添加方法和变量等.编译再反编译可以看到枚举类型对应的类的内容. 每个枚举常量都对应一个 ...

  9. 窥探Swift之别样的枚举类型

    想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...

随机推荐

  1. UE项目打包

    https://docs.unrealengine.com/zh-CN/Engine/Basics/Projects/Packaging/index.html 必须先对虚幻项目进行正确打包,之后才能将 ...

  2. 第I位是0/1

    int a; scanf("%d",&a); ;i<;i++) { ;//从右往左第i位是x ,i==0,就是第一位 printf("%d ",x ...

  3. 【转帖】国产PCIe SSD主控芯片获得中国芯大奖 3500MB/s读取

    国产PCIe SSD主控芯片获得中国芯大奖 3500MB/s读取 https://www.cnbeta.com/articles/tech/906033.htm 国产主控 在日前的2019“中国芯”集 ...

  4. 【C++札记】类的继承

    继承 面向对象的设计思想,类对数据做了封装,并可以加入访问权限,类的继承是面向对象思想的精髓.类的继承可以让新类从以有的类中获得已有的特征.原有类称为基类或父类,新类称为派生类或子类. 语法: cla ...

  5. 你应该掌握linux中Bash命令的一些快捷方式

    在本文中,我们将分享许多对任何Linux用户都有用的Bash命令行快捷方式.这些快捷方式可以快速地执行某些动作,例如访问和运行先前执行的命令,打开编辑器,在命令行上编辑/删除/更改文本,移动光标,控制 ...

  6. 《学渣的电子技术自学笔记》——三极管的放大区、截止区与饱和区(基于NPN型)

    <学渣的电子技术自学笔记>--三极管的放大区.截止区与饱和区(基于NPN型) 1.放大区   三极管输出特性曲线近似水平的部分是放大区.在放大区,\(I_C=\overline{β}I_B ...

  7. MySQL 总结篇 [在Oracle基础上学习的MySQL]

    一.学习环境 MySQL 5.7社区版 Navicat for MySQL 百度网盘下载链接:https://pan.baidu.com/s/1yGnznwoZ8CaMgrCsDBhKAQ 二.MyS ...

  8. 关于goquery的“non-standard import”错误

    goquery运行缺包就用get github.com\andybalholm\cascadia下到gopath,然后出现“non-standard import”错误,说明github.com\an ...

  9. 使用PHP开发HR系统(1)

    本文通过笔者的实践,讲述如何以PHP+CI+Postgres构建一套人力资源管理系统. ======================================================== ...

  10. module 'pip._internal' has no attribute 'pep425tags'

    一.问题分析 这是python 3.x不能用2.x的版本问题 二.解决方案 import wheel.pep425tags as w print(w.get_supported()) 输出: [('c ...