Google Protobuf Primer (2) Language Guide

Google Protobuf Primer (2) Language Guide

去年年初初次接触 Google Protobuf,如今已经有不少变化,从这篇开始,续一下 :)

1. Specifying Field Rules

You specify that message fields are one of the following:

  • required: a well-formed message must have exactly one of this field.
  • optional: a well-formed message can have zero or one of this field (but not more than one).
  • repeated: this field can be repeated any number of times (including zero) in a well-formed message. The order of the repeated values will be preserved.

For historical reasons, repeated fields of basic numeric types aren't encoded as efficiently as they could be. New code should use the special option [packed=true] to get a more efficient encoding. For example:

repeated int32 samples = 4 [packed=true];

But when you use it as the following:

message Locations {
    repeated Location location = 1 [packed=true];

compile it, then you will got a warning:

[packed = true] can only be specified for repeated primitive fields.

So pay attention to the type of fields you intend to specify.

2. Scalar Value Types

proto TypeNotesC++ TypeJava Type
double doubledouble
float floatfloat
int32variable-len, inefficient for negative numint32int
int64variable-len, inefficient for negative numint64long
sint32variable-len, signed numint32int
sint64variable-len, signed numint64long
fixed32always 4-byte, efficient > 228int32int
fixed64always 8-byte, efficient > 256int64long
sfixed32always 4-byteint32int
sfixed64always 8-btyeint64long
bool boolboolean
stringUTF-8 string, 7-bit ASCII stringstringString
bytesany arbitrary sequence of bytesstringByteString


  • 可正可负,范围小(228或256以内):sint32 或 sint64
  • 可正可负,范围大(228或256以上):sfixed32 或 sfixed64
  • 只会正的,范围小(228或256以内):uint32 或 uint64
  • 只会正的,范围大(228或256以上):fixed32 或 fixed64
  • 布尔:bool
  • 浮点:float 或 double
  • utf8 string 或 7-bit ascii string:string
  • ByteString:bytes




©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页