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. springboot2 配置 https

    package cn.xiaojf.aibus.configure; import org.apache.catalina.Context; import org.apache.catalina.co ...

  2. 第1/7Beta冲刺

    1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...

  3. csp联考T1

    本题主要难点在于如何处理dist^2的问题 40分算法 n^2暴力就不必多嘴,直接枚举根节点DFS就行了. 70分算法 对于b=0的情况,我们可以考虑用换根法来计算根节点的变化对总权值带来的影响. 换 ...

  4. 切换 Python2 Python3

    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternati ...

  5. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    一.认证组件 使用方法: ①写一个认证类,新建文件:my_examine.py # 导入需要继承的基类BaseAuthentication from rest_framework.authentica ...

  6. Ubuntu下载搜狗输入法

    实在...因为百度上写的就很好了,所以这里就直接“链”了.. https://jingyan.baidu.com/article/2d5afd6933a67b85a2e28e9f.html

  7. SpringBoot项目启动不走内嵌容器

    一.问题 springboot项目java -jar启动不走内嵌容器,如下图,可以看到是直接走系统环境变量里配置的tomcat容器了 二.分析 我的pom.xml文件关键依赖: <depende ...

  8. Exception: HTTP 599: SSL certificate problem: unable to get local issuer certificate 解决办法

    使用Pyspider中报此错误. 错误原因: 这个错误会发生在请求 https 开头的网址,SSL 验证错误,证书有误. 解决方法: 使用self.crawl(url, callback=self.i ...

  9. js获取项目名称

    //获取路径 var pathName=window.document.location.pathname; //截取,得到项目名称 var projectName=pathName.substrin ...

  10. ASP.NET Core & 双因素验证2FA 实战经验分享

    必读 本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明. 为了防止不提供原网址的转载,特在这里加上原文链接: https:// ...