Protobuf Java 语言对应用法 : https://developers.google.com/protocol-buffers/docs/javatutorial
使用时 , 参考上述页面的文档说明 , 进行开发 ;
首先 , 编写 Protobuf 源文件 , 使用官方提供的源文件 , 进行开发 ;
syntax = "proto2";
package tutorial;
option java_multiple_files = true;
option java_package = "com.example.tutorial.protos";
option java_outer_classname = "AddressBookProtos";
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
在 Android Studio 工程中的 " app/src/main " 目录下 , 创建 proto 目录 , 在该 " app/src/main/proto " 目录下 , 创建 " addressbook.proto " 源文件 ;
将官方的 proto 示例源码拷贝到该文件中 ;
( 上图的源码添加了注释 )
设置 protobuf 语法版本 : Protocol Buffers 有 proto2 和 proto3 两个版本 , 这两个版本之间的 语法 , 与 底层实现 都有一定的不同 ;
syntax = "proto2";
设置生成 Java 源文件的包名和类名 :
// 生成 Java 源文件包名
option java_package = "com.example.tutorial.protos";
// 生成 Java 源文件类名
option java_outer_classname = "AddressBookProtos";
设置生成 Java 类 : message 相当于 Java 中的 class , 编译出的源文件就是 class Person{}
;
// message 相当于 Java 中的 class
// 编译出的源文件就是 class Person{}
message Person {
设置生成 Java 类的字段名称 : 字段前有 optional 和 required 修饰 , 如果被 required 修饰 , 表示该字段不能为空 ; 被 optional 修饰 , 表示可选的 , 可以设置为空 ;
在创建后 , 会检测被 required 修饰的字段 , 如果没有赋初值 , 就会报错 ;
// String 类型的字段
// 字段前有 optional 和 required 修饰
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
枚举值 : Protobuf 中设置枚举与 Java 相同 , 定义和使用的用法如下 ;
// 枚举
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
// 字段值是枚举类型, 默认是 HOME 类型
optional PhoneType type = 2 [default = HOME];
}
集合 : 使用 repeated 修饰字段 , 表示重复的数据 , 即集合 ;
// 表示重复的数据 , 即集合
// 有多个 PhoneNumber phones 组成的集合
repeated PhoneNumber phones = 4;
完整带注释的 Protobuf 源文件 :
// 指定 Protocol Buffers 语法版本
syntax = "proto2";
package tutorial;
option java_multiple_files = true;
// 生成 Java 源文件包名
option java_package = "com.example.tutorial.protos";
// 生成 Java 源文件类名
option java_outer_classname = "AddressBookProtos";
// message 相当于 Java 中的 class
// 编译出的源文件就是 class Person{}
message Person {
// String 类型的字段
// 字段前有 optional 和 required 修饰
optional string name = 1;
// int 整型 , 32 位
optional int32 id = 2;
optional string email = 3;
// 枚举
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
// 字段值是枚举类型, 默认是 HOME 类型
optional PhoneType type = 2 [default = HOME];
}
// 表示重复的数据 , 即集合
// 有多个 PhoneNumber phones 组成的集合
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
Protobuf 参考资料 :