• protobuf语法简介2


    protobuf语法简介2

    1.optional的字段和默认值

    如上所述,消息描述中的一个元素可以被标记为“可选的optional)。一个格式良好的消息可以包含0个或一个optional的元素。当解析消息时,如果它不包含optional的元素值,那么解析出来的对象中的对应字段就被置为默认值。默认值可以在消息描述文件中指定。例如,要为 SearchRequest消息的result_per_page字段指定默认值10,在定义消息格式时如下所示:

    optional int32 result_per_page = 3 [default = 10];

    如果没有为optional的元素指定默认值,就会使用与特定类型相关的默认值:对string来说,默认值是空字符串。对bool来说,默认值是false。对数值类型来说,默认值是0。对枚举来说,默认值是枚举类型定义中的第一个值。

    2.枚举

    当需要定义一个消息类型的时候,可能想为一个字段指定某“预定义值序列中的一个值。例如,假设要为每一个SearchRequest消息添加一个 corpus字段,而corpus的值可能是UNIVERSALWEBIMAGESLOCALNEWSPRODUCTSVIDEO中的一个。其实可以很容易地实现这一点:通过向消息定义中添加一个枚举(enum)就可以了。一个enum类型的字段只能用指定的常量集中的一个值作为其值(如果尝试指定不同的值,解析器就会把它当作一个未知的字段来对待)。在下面的例子中,在消息格式中添加了一个叫做Corpus的枚举类型——它含有所有可能的值 ——以及一个类型为Corpus的字段:

    message SearchRequest {

    required string query = 1;

    optional int32 page_number = 2;

    optional int32 result_per_page = 3 [default = 10];

    enum Corpus {

    UNIVERSAL = 0;

    WEB = 1;

    IMAGES = 2;

    }

    optional Corpus corpus = 4 [default = IMAGES ];

    }

    枚举常量必须在32位整型值的范围内。因为enum值是使用可变编码方式的,对负数不够高效,因此不推荐在enum中使用负数。如上例所示,可以在一个消息定义的内部或外部定义枚举——这些枚举可以在.proto文件中的任何消息定义里重用。当然也可以在一个消息中声明一个枚举类型,而在另一个不同的消息中使用它——采用MessageType.EnumType的语法格式。

    当对一个使用了枚举的.proto文件运行protocol buffer编译器的时候,生成的代码中将有一个对应的enum(对JavaC++来说),或者一个特殊的EnumDescriptor类(对 Python来说),它被用来在运行时生成的类中创建一系列的整型值符号常量(symbolic constants)。

    3.使用其他消息类型

    你可以将其他消息类型用作字段类型。例如,假设在每一个SearchResponse消息中包含Result消息,此时可以在相同的.proto文件中定义一个Result消息类型,然后在SearchResponse消息中指定一个Result类型的字段,如:

    message SearchResponse {

    repeated Result result = 1;

    }

    message Result {

    required string url = 1;

    optional string title = 2;

    repeated string snippets = 3;

    }

    4.导入定义

    在上面的例子中,Result消息类型与SearchResponse是定义在同一文件中的。如果想要使用的消息类型已经在其他.proto文件中已经定义过了呢?

    你可以通过导入(importing)其他.proto文件中的定义来使用它们。要导入其他.proto文件的定义,你需要在你的文件中添加一个导入声明,如:

    import "myproject/other_protos.proto";

    protocol编译器就会在一系列目录中查找需要被导入的文件,这些目录通过protocol编译器的命令行参数-I/–import_path指定。如果不提供参数,编译器就在其调用目录下查找。

    5.嵌套类型

    你可以在其他消息类型中定义、使用消息类型,在下面的例子中,Result消息就定义在SearchResponse消息内,如:

    message SearchResponse {

    message Result {

    required string url = 1;

    optional string title = 2;

    repeated string snippets = 3;

    }

    repeated Result result = 1;

    }

    如果你想在它的父消息类型的外部重用这个消息类型,你需要以Parent.Type的形式使用它,如:

    message SomeOtherMessage {

    optional SearchResponse.Result result = 1;

    }

    当然,你也可以将消息嵌套任意多层,如:

    message Outer {                  // Level 0

    message MiddleAA {  // Level 1

    message Inner {   // Level 2

    required int64 ival = 1;

    optional bool  booly = 2;

    }

    }

    message MiddleBB {  // Level 1

    message Inner {   // Level 2

    required int32 ival = 1;

    optional bool  booly = 2;

    }

    }

    }

    原文

    http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/reference/overview.html

    http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html

  • 相关阅读:
    机器不学习:如何处理数据中的「类别不平衡」?
    机器不学习:一种提升预测能力的方法-机器学习模型
    机器不学习:CNN 入门讲解1-什么是卷积
    机器不学习:浅析深度学习在实体识别和关系抽取中的应用
    机器不学习:用神经模块网络学习推理
    机器不学习:初识迁移学习
    机器不学习:一文彻底读懂智能对话系统
    跟随鼠标的div
    回到顶部的流畅滚动——scrollTop
    js学习小笔记
  • 原文地址:https://www.cnblogs.com/mydomain/p/3181242.html
Copyright © 2020-2023  润新知