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

简介: 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )

文章目录

一、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.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


目录
相关文章
|
2月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
67 10
|
3月前
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
|
5月前
|
存储 Java Android开发
Android上在两个Activity之间传递Bitmap对象
Android上在两个Activity之间传递Bitmap对象
38 2
|
5月前
|
Java Android开发
程序与技术分享:Android使用Dagger注入的方式初始化对象的简单使用
程序与技术分享:Android使用Dagger注入的方式初始化对象的简单使用
138 0
|
6月前
|
XML Android开发 数据格式
Android五大布局对象---FrameLayout,LinearLayout ,Absolute
Android五大布局对象---FrameLayout,LinearLayout ,Absolute
35 1
|
6月前
|
Android开发 对象存储
OSS对象储存android开发进行下载到本地文件时异步操作失效
android vivo80使用官方示例代码进行文件下载,但是使用oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>()时onSuccess和onFailure不执行
|
6月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
117 0
|
6月前
|
Android开发
[Android jni] Bitmap与Mat对象的相互转换
[Android jni] Bitmap与Mat对象的相互转换
205 0
|
6月前
|
C++
[序列化协议] --- protobuf
[序列化协议] --- protobuf
60 0
|
6月前
protobuf 序列化和反序列化
protobuf 序列化和反序列化
38 0