1. syntax = “proto3”;
  2. message SearchRequest {……}
    message 定义实体
  3. 主导数据列
    图片 1


  4. 诠释符号: 双倾线,如://xxxxxxxxxxxxxxxxxxx

  5. 字段唯一数字标识(用于在亚前进制格式中分辨各个字段,上线后不宜再变更):Tags
    标识数字之法定范围:最小是1,最可怜是 229 –
    此外,不克下19000 到
    19999里头的数字(FieldDescriptor::kFirstReservedNumber through
  6. 字段修饰符:
    repeated:一个字段在官方的信息中可以又出现一定次数(包括零次)。重复出现的价值的程序将为封存。在proto3中,重复出现的值类型字段默认使用压缩编码。你可以于此间找到更多关于压缩编码的东西: Protocol
    默认值: optional PhoneType type = 2 [default = HOME];
  7. 代理类生成
    1. C++, 每一个.proto 文件可以十分成一个 .h 文件及一个 .cc 文件
    2. Java, 每一个.proto文件可以挺成一个 .java 文件
    3. Python,
    4. Go, 每一个.proto生成一个 .pb.go 文件
    5. Ruby, 每一个.proto生成一个 .rb 文件
    6. Objective-C, 每一个.proto 文件可以非常成一个 pbobjc.h
      和一个pbobjc.m 文件
    7. C#, 每一个.proto文件可以很成一个.cs文件.
  8. 配段默认值
    1. strings, 默认值是空字符串(empty string)
    2. bytes, 默认值是空bytes(empty bytes)
    3. bools, 默认值是false
    4. numeric, 默认值是0
    5. enums, 默认值是首先单枚举值(value必须为0)
    6. message fields, the field is not set. Its exact value is
      langauge-dependent. See the generated code guide for details.
    7. repeated fields,默认值为empty,通常是一个空list
  9. 枚举
    图片 2 
  1. Maps字段类型:map<key_type, value_type> map_field = N;
    1. map字段未能够是repeated.
    2. Wire format ordering and map iteration ordering of map values is
      undefined, so you cannot rely on your map items being in a
      particular order.
    3. When generating text format for a .proto, maps are sorted by
      key. Numeric keys are sorted numerically.
    4. When parsing from the wire or when merging, if there are
      duplicate map keys the last key seen is used. When parsing a map
      from text format, parsing will fail if there are duplicate keys.
    1. 更新.proto文件
    2. 未克改就在字段的绝无仅有数字标识符(tags)
    3. If you add new fields, any messages serialized by code using
      your “old” message format can still be parsed by your new
      generated code. You should keep in mind the default values for
      these elements so that new code can properly interact with
      messages generated by old code. Similarly, messages created by
      your new code can be parsed by your old code: old binaries
      simply ignore the new field when parsing. Note that unknown
      fields are discarded when the message is deserialized, so if the
      message is passed on to new code, the new fields will not still
      be available (this is different behaviour to proto2, where
      unknown fields are serialized along with the message).
    4. 针对遗弃之字段,它的tags不能被再次用,可以免去,而是于字段添加“OBSOLETE_
    5. int32, uint32, int64, uint64,
    6. sint32 和 sint64 是匹配的,但是与任何的数字型不兼容
    7. string 和 bytes 是匹配的,由于bytes也是 UTF-8格式
    8. Embedded messages are compatible with bytes if the bytes contain
      an encoded version of the message.
    9. fixed32 和 sfixed32兼容, fixed64和sfixed64兼容
    10. enum 和 int32, uint32, int64, and uint64 in terms of wire format
      (note that values will be truncated if they don’t fit). However
      be aware that client code may treat them differently when the
      message is deserialized: for example, unrecognized proto3 enum
      types will be preserved in the message, but how this is
      represented when the message is deserialized is
      language-dependent. Int fields always just preserve their value.
  2. Packages支持
  3. 定义Services
  4. 其他Options:

    1. java_package(file option):option java_package =
    2. java_outer_classname(file option ):option
      java_outer_classname = “Ponycopter”;
    3. optimize_for(file option ):值为SPEED,
      CODE_SIZE或LITE_RUNTIME;如:option optimize_for =

        • SPEED (default): The protocol buffer compiler will
          generate code for serializing, parsing, and performing
          other common operations on your message types. This code
          is extremely highly optimized.
        • CODE_SIZE: The protocol buffer compiler will generate
          minimal classes and will rely on shared,
          reflection-based code to implement serialialization,
          parsing, and various other operations. The generated
          code will thus be much smaller than with SPEED, but
          operations will be slower. Classes will still implement
          exactly the same public API as they do in SPEED mode.
          This mode is most useful in apps that contain a very
          large number .proto files and do not need all of them
          to be blindingly fast.
        • LITE_RUNTIME: The protocol buffer compiler will
          generate classes that depend only on the “lite” runtime
          library (libprotobuf-lite instead of libprotobuf).
          The lite runtime is much smaller than the full library
          (around an order of magnitude smaller) but omits certain
          features like descriptors and reflection. This is
          particularly useful for apps running on constrained
          platforms like mobile phones. The compiler will still
          generate fast implementations of all methods as it does
          in SPEED mode. Generated classes will only implement
          the MessageLite interface in each language, which
          provides only a subset of the methods of the
          full Message interface.
    4. cc_enable_arenas (file option ): 生成C++代码时启用arena

    5. objc_class_prefix (file option ): 设置 Objective-C
      class前缀,which is prepended to all Objective-C generated
      classes and enums from this .proto. There is no default. You
      should use prefixes that are between 3-5 uppercase characters as
      recommended by Apple. Note that all 2 letter prefixes are
      reserved by Apple.
    6. deprecated (field option):
      most languages this has no actual effect. In Java, this becomes
      a @Deprecated annotation. In the future, other language-specific
      code generators may generate deprecation annotations on the
      field’s accessors, which will in turn cause a warning to be
      emitted when compiling code which attempts to use the field. If
      the field is not used by anyone and you want to prevent new
      users from using it, consider replacing the field declaration
      with a reserved statement.
      int32 old_field = 6 [deprecated=true];



 图片 3



 图片 4