.proto示例代码如下:
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;// Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
/*
*.proto文件以包生明开头,这个声明可以避免不同项目之间命名的冲突问题。在Java语言中,如果你没有指定java_package的话,这个包名可以作为java源文件的包名,
*如下边的“option java_package = “com.example.tutorial”;”。即使你提供了java_package,你仍然需要定义一个package来避免在Protocol Buffers中的命名冲突问题,
*非Java语言也是如此。
*/
package tutorial;
/*
*在包生明之后,你可以看到如下两个Java特有选项:java_package 和 java_outer_classname。
*java_package:指定了classes的包名,如果你没有明确的指定此参数,程序将会把上边package的值作为classes的包名,但是通常情况下这些值不适合作为包名(因为他们并没有以域名开头)。
*java_outer_classname:定义了外部类的名称。如果你没有明确的指定该参数,将会把.proto文件名转换成类的名称。例如,”my_proto.proto”文件在默认情况下,会使用MyProto作为外部类的名称。
*/
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
/*
*接下来是消息体的定义。消息体仅仅是一些类型字段的集合。许多标准的简单数据类型都可以作为字段类型,包括bool, int32, float, double, and string。
*你也可以通过使用其他消息类型作为字段类型来添加更深层次的结构到你的消息-在下边的代码中,Person消息里边包含了PhoneNumber消息,同时AddressBook消息包含了Person消息。
*你也可以在消息内嵌入其他的消息-如下所示,PhoneNumber定义在了Person内。
*如果你想一个字段具有一个指定列表的值的话,你也可以定义enum类型-如下所示,PhoneType就是enum类型。
*/
/*
*每个元素的“= 1”,“= 2”的标记标识字段使用中的二进制编码的独特的“标签”。标签号1-15需要少一个字节高于数字编码,以便作为一个优化可以决定使用这些标签对于常用的或重复的元素,
*而使标签16和更高的不太常用的可选元素。每个repeated的字段都需要重复编码这个标签号,所以repeated字段特别适合这种优化。
*/
/*
*每个字段必须被下面其中一个修饰符注释:
* required: 字段的值必须被提供,否则消息会被认为是“uninitialized”。尝试build一个uninitialized的消息会抛出RuntimeException。
* 解析一个uninitialized的消息将会抛出IOException。除此之外,必填字段的行为完全像一个可选字段。
* optional: 字段可以设置,也可以不设置。如果没有设置,将会使用默认值。对于简单类型,你可以指定自己的默认值,就像我们在例子中设置PhoneNumber一样。
* 否则,使用系统默认值:数值类型是0,字符串是空字符串,bool是false。对于嵌入式消息,默认值始终是“默认实例”或“原型”的消息,有没有其字段设置的。
* 调用访问器来获得其尚未明确设置总是返回该字段的默认值可选(或必须)字段的值。
* repeated: 字段可以被重复任意次数(包含0次).重复值的顺序将在协议缓冲区被保留。想想反复领域的动态大小的阵列。
*/
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}