文章目录
- 一、Protobuf 源码分析
- 二、创建 Protobuf 对象
- 三、完整代码示例
- 四、参考资料
一、Protobuf 源码分析
Protobuf 源文件如下 : addressbook.proto :
代码语言:javascript复制// 指定 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;
}
在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( protobuf-gradle-plugin 插件简介 | Android Studio 中配置插件 | AS 中编译源文件 ) 中 , 使用了 Gradle 插件 , 自动将 Android Studio 工程中的 Protobuf 编译成了 Java 源码 , 现在开始使用生成的 Java 源码进行开发 ;
在 Protobuf 源码 addressbook.proto 中 , 有一个 AddressBook 类 , 其中有一个 Person 集合 , Person 类中还包含 PhoneNumber 集合 ;
二、创建 Protobuf 对象
创建 Protobuf 对象时 , 先创建对应对象的 Builder 构造器 ;
如果一个复杂的对象由多个对象组成 , 则将它们的 Builder 构造器先拼装起来 , 最后调用一次 build 方法 , 创建最终的复杂对象 ; 每个对象的构造器都是由该对象的 newBuilder 静态方法进行创建 ;
创建 AddressBook 对象 , 每个 AddressBook 对象中包含若干 Person 对象 , 每个 Person 对象中包含 若干 PhoneNumber 枚举值 , 如果对象的某字段在 Protobuf 源码中被 required 修饰 , 则该字段必须被赋值 ;
首先要创建 PhoneNumber 构造器 ,
代码语言:javascript复制// 创建 Person.PhoneNumber.Builder 对象
var phoneNumber1Builder: Person.PhoneNumber.Builder =
Person.PhoneNumber.newBuilder().
setNumber("666")
然后创建 Person 构造器 : 创建 Person 构造器时 , 可以将 PhoneNumber 构造器拼装进来 ,
代码语言:javascript复制// 创建 Person.Builder 对象
var person1Builder: Person.Builder =
Person.newBuilder().
setName("Tom").
setId(0).
addPhones(phoneNumber1Builder)
之后创建 AddressBook 构造器 : 创建时可以将多个 Person 构造器拼装进来 ,
代码语言:javascript复制// 使用 newBuilder 方法创建 AddressBook.Builder 对象
var addressBookBuilder: AddressBook.Builder =
AddressBook.newBuilder().
addPeople(person1Builder).
addPeople(person2Builder)
最终 , 调用 AddressBook.Builder 这个拼装后最大的构造器的 build 方法 , 创建 AddressBook 对象 ;
三、完整代码示例
完整代码示例 :
代码语言:javascript复制package kim.hsl.protobuf
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.tutorial.protos.AddressBook
import com.example.tutorial.protos.Person
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 创建 Person.PhoneNumber.Builder 对象
var phoneNumber1Builder: Person.PhoneNumber.Builder =
Person.PhoneNumber.newBuilder().
setNumber("666")
// 创建 Person.Builder 对象
var person1Builder: Person.Builder =
Person.newBuilder().
setName("Tom").
setId(0).
addPhones(phoneNumber1Builder)
// 创建 Person.PhoneNumber.Builder 对象
var phoneNumber2Builder: Person.PhoneNumber.Builder =
Person.PhoneNumber.newBuilder().
setNumber("888")
// 创建 Person.Builder 对象
var person2Builder: Person.Builder =
Person.newBuilder().
setName("Jerry").
setId(1).
addPhones(phoneNumber2Builder)
// 使用 newBuilder 方法创建 AddressBook.Builder 对象
var addressBookBuilder: AddressBook.Builder =
AddressBook.newBuilder().
addPeople(person1Builder).
addPeople(person2Builder)
// 将上述各个 Builder 拼装完毕后 , 最后调用 build
// 即可得到最终对象
var addressBook: AddressBook = addressBookBuilder.build()
}
}
四、参考资料
Protobuf 参考资料 :
- Protobuf 官网主页 : https://developers.google.com/protocol-buffers
- Protobuf 语法指南 : https://developers.google.com/protocol-buffers/docs/proto
- Protobuf Java 语言对应用法 : https://developers.google.com/protocol-buffers/docs/javatutorial
- Protobuf 下载地址 : https://developers.google.com/protocol-buffers/docs/downloads
- Protobuf 源码地址 : https://github.com/protocolbuffers/protobuf
- Protobuf 发布版本下载地址 : https://github.com/protocolbuffers/protobuf/releases
- protobuf-gradle-plugin 项目地址 : https://github.com/google/protobuf-gradle-plugin
博客源码 :
- GitHub 地址 : https://github.com/han1202012/Protocol_Buffers
- CSDN 快照 : https://download.csdn.net/download/han1202012/18181938