文章目录
- 一、Protobuf 序列化
- 二、Protobuf 反序列化
- 三、完整代码
- 四、参考资料
一、Protobuf 序列化
在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 ) 中 , 创建了 Protobuf 对象 , 本博客中将其序列化 , 保存到本地文件中 ;
序列化操作 : 调用 Protobuf 对象的 toByteArray 方法 , 可以将对象序列化为字节数组 ;
代码语言:javascript复制 // 将 addressBook 对象转为字节数组
var bytes: ByteArray = addressBook.toByteArray()
序列化操作代码示例 :
代码语言:javascript复制 // 序列化操作
var serializeStart = System.currentTimeMillis()
// 将 addressBook 对象转为字节数组
var bytes: ByteArray = addressBook.toByteArray()
Log.i(TAG, "序列化耗时 ${System.currentTimeMillis() - serializeStart} ms , 序列化大小 ${bytes.size} 字节")
日志打印结果 :
代码语言:javascript复制2021-04-27 10:11:17.053 10000-10000/kim.hsl.protobuf I/MainActivity: 序列化耗时 4 ms , 序列化大小 34 字节
二、Protobuf 反序列化
反序列化操作 : 调用 Protobuf 对象的 parseFrom 方法 , 传入字节数组作为参数 , 可以字节数组反序列化为 Protobuf 对象 ;
代码语言:javascript复制var deserializeAddressBook: AddressBook = AddressBook.parseFrom(bytes)
反序列化操作代码示例 :
代码语言:javascript复制 // 反序列化操作
var deserializeStart = System.currentTimeMillis()
var deserializeAddressBook: AddressBook = AddressBook.parseFrom(bytes)
Log.i(TAG, "反序列化耗时 ${System.currentTimeMillis() - serializeStart} ms")
日志打印结果 :
代码语言:javascript复制2021-04-27 10:11:17.056 10000-10000/kim.hsl.protobuf I/MainActivity: 反序列化耗时 7 ms
三、完整代码
完整代码示例 :
代码语言:javascript复制package kim.hsl.protobuf
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.tutorial.protos.AddressBook
import com.example.tutorial.protos.Person
class MainActivity : AppCompatActivity() {
companion object{
val TAG = "MainActivity"
}
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()
// 序列化操作
var serializeStart = System.currentTimeMillis()
// 将 addressBook 对象转为字节数组
var bytes: ByteArray = addressBook.toByteArray()
Log.i(TAG, "序列化耗时 ${System.currentTimeMillis() - serializeStart} ms , 序列化大小 ${bytes.size} 字节")
// 反序列化操作
var deserializeStart = System.currentTimeMillis()
var deserializeAddressBook: AddressBook = AddressBook.parseFrom(bytes)
Log.i(TAG, "反序列化耗时 ${System.currentTimeMillis() - serializeStart} ms")
}
}
执行结果 :
代码语言:javascript复制2021-04-27 10:11:17.053 10000-10000/kim.hsl.protobuf I/MainActivity: 序列化耗时 4 ms , 序列化大小 34 字节
2021-04-27 10:11:17.056 10000-10000/kim.hsl.protobuf I/MainActivity: 反序列化耗时 7 ms
四、参考资料
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