gRPC-Protocol语法指南 (2)

Python稍有不同-Python编译器会在.proto中生成带有每种消息类型的静态描述符的模块,然后将该模块与元类一起使用,以在运行时创建必要的Python数据访问类。

对于Go,编译器会生成一个.pb.go文件,其中包含文件中每种消息类型的类型。

对于Ruby,编译器将使用包含您的消息类型的Ruby模块生成一个.rb文件。

对于Objective-C,编译器从每个.proto生成一个pbobjc.h和pbobjc.m文件,并为文件中描述的每种消息类型提供一个类。

对于C#,编译器从每个.proto生成一个.cs文件,并为文件中描述的每种消息类型提供一个类。

对于Dart,编译器会生成一个.pb.dart文件,其中包含文件中每种消息类型的类。

您可以按照所选语言的教程(即将推出proto3版本)查找有关每种语言使用API​​的更多信息。有关API的更多详细信息,请参见相关的API参考(proto3版本也即将推出)。

Scalar Value Types

标量消息字段可以具有以下类型之一-该表显示.proto文件中指定的类型,以及自动生成的类中的相应类型:

gRPC-Protocol语法指南


在协议缓冲区编码中序列化消息时,您可以找到更多有关这些类型如何编码的信息。

[1]在Java中,无符号的32位和64位整数使用带符号的对等体表示,最高位仅存储在符号位中。

[2]在所有情况下,将值设置为字段都会执行类型检查以确保其有效。

[3] 64位或无符号32位整数在解码时始终表示为long,但是如果在设置字段时给出了int,则可以为int。 在所有情况下,该值都必须适合设置时表示的类型。 参见[2]。

[4] Python字符串在解码时表示为unicode,但如果给出了ASCII字符串,则可以为str(此字符串可能会发生变化)。

[5]在64位计算机上使用Integer,在32位计算机上使用string。

Default Values

解析消息时,如果编码的消息不包含特定的单数元素,则已解析对象中的相应字段将设置为该字段的默认值。这些默认值是特定于类型的:

对于字符串,默认值为空字符串。

对于字节,默认值为空字节。

对于布尔值,默认值为false。

对于数字类型,默认值为零。

对于枚举,默认值为第一个定义的枚举值,必须为0。

对于消息字段,未设置该字段。它的确切值取决于语言。有关详细信息,请参见生成的代码指南。

重复字段的默认值为空(通常为相应语言的空列表)。

请注意,对于标量消息字段,一旦解析了一条消息,就无法判断是将字段明确设置为默认值(例如,是否将布尔值设置为false)还是根本没有设置:您应该在定义消息类型时要注意。例如,如果您不希望默认情况下也发生这种情况,则当布尔值设置为false时,没有布尔值会打开某些行为。还要注意,如果将标量消息字段设置为其默认值,则该值将不会在线路上被序列化。

有关默认值在生成的代码中如何工作的更多详细信息,请参见所选语言的生成的代码指南。

Enumerations

在定义消息类型时,您可能希望其字段之一仅具有一个预定义的值列表之一。 例如,假设您要为每个SearchRequest添加一个语料库字段,该语料库可以是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作为数字默认值。

零值必须是第一个元素,以便与proto2语义兼容,其中第一个枚举值始终是默认值。

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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjwyp.html