文章目录

  • 一、Protobuf 源码分析
  • 二、创建 Protobuf 对象
  • 三、完整代码示例
  • 四、参考资料

一、Protobuf 源码分析


Protobuf 源文件如下 : addressbook.proto :

// 指定 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 构造器 ,

// 创建 Person.PhoneNumber.Builder 对象
var phoneNumber1Builder: Person.PhoneNumber.Builder =Person.PhoneNumber.newBuilder().setNumber("666")

然后创建 Person 构造器 : 创建 Person 构造器时 , 可以将 PhoneNumber 构造器拼装进来 ,

// 创建 Person.Builder 对象
var person1Builder: Person.Builder =Person.newBuilder().setName("Tom").setId(0).addPhones(phoneNumber1Builder)

之后创建 AddressBook 构造器 : 创建时可以将多个 Person 构造器拼装进来 ,

// 使用 newBuilder 方法创建 AddressBook.Builder 对象
var addressBookBuilder: AddressBook.Builder =AddressBook.newBuilder().addPeople(person1Builder).addPeople(person2Builder)

最终 , 调用 AddressBook.Builder 这个拼装后最大的构造器的 build 方法 , 创建 AddressBook 对象 ;

三、完整代码示例


完整代码示例 :

package kim.hsl.protobufimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.tutorial.protos.AddressBook
import com.example.tutorial.protos.Personclass 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

【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )相关推荐

  1. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

  2. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  3. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  4. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )

    文章目录 前言 一.ActivityManagerService.attachApplicationLocked 二.ActivityStackSupervisor.attachApplication ...

  5. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 )

    文章目录 前言 一.ActivityThread 类 handleLaunchActivity -> performLaunchActivity 方法 二.Instrumentation.new ...

  6. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )

    文章目录 前言 一.ClientTransactionHandler.scheduleTransaction 二.ActivityThread.H 处理 EXECUTE_TRANSACTION 消息 ...

  7. 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 )

    文章目录 前言 一.热启动与冷启动选择 二.AMS 进程中执行的相关操作 三.通过 Binder 机制转到 ActivityThread 中执行的操作 总结 前言 上一篇博客 [Android 启动过 ...

  8. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

  9. Android 9 (P) Zygote进程启动源码分析指南二

         Android 9 Zygote进程启动源码分析指南二 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

最新文章

  1. Java项目:前台预定+后台管理酒店管理系统(java+SSM+jsp+mysql+maven)
  2. iOS边练边学--iOS中的XML数据解析
  3. Python基础知识(第四天)
  4. Spring Boot定时任务-Job类对象注入
  5. 上周面试回来后写的Java面试总结,想进BAT必看
  6. oracle云数据库 免费的吗,使用免费的Oracle云服务-创建ATP数据库
  7. 学习路上遇到的Error2
  8. centos7下swoole1.9的安装与HttpServer的使用
  9. Codeforces Round #728 (Div. 2)
  10. java.util.Scanner应用详解
  11. css遮罩层从下往上_CSS:图片自带3px下边距的bug修复
  12. ubuntu切换python版本
  13. 中文情感分析之TextCNN
  14. webstorm 移动到末尾并且换行快捷键
  15. 基于Unity3D的相机功能的实现(六)—— 上帝视角(王者荣耀视角)
  16. 算法复杂性分析及运算规则证明(一)
  17. 博后招募 | 广州国家实验室闵明玮课题组诚聘博士后、副研究员和研究实习员...
  18. 使用Javascript无限添加QQ好友原理解析
  19. FFmpeg实现音频解码并播放
  20. 路的选择与人生的哲思──读《未选择的路》

热门文章

  1. [网站上线]Lamp环境及其后续配置
  2. 后盾网lavarel视频项目---lavarel中的tinker是什么
  3. vue keep-alive解决关闭标签动态缓存问题
  4. Makefile:160: recipe for target 'all' failed (Ubuntu 16.06 + Opencv3.2)解决办法
  5. 尝试create tech team
  6. 2.25-3.2 周记
  7. 【3-12】数据库子查询及聚合函数
  8. ThinkPHP分页实例
  9. 【原创】leetCodeOj ---Convert Sorted List to Binary Search Tree 解题报告
  10. jquery实现停留半秒后再选择