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