一、Protobuf介紹
protobuf是一個輕便高效的數據序列化協議,常用於網絡數據傳輸、數據存儲等場景,由Google開發並開源。比起XML和JSON,protobuf序列化後的數據更小、更快速,耗費的CPU和內存也更少。
二、Android Protobuf使用
Android protobuf是protobuf在Android平台上的一個實現。它提供了一組API,可以將Java對象和protobuf數據相互轉換。
1.添加依賴
在app module的build.gradle文件中添加如下依賴:
implementation 'com.google.protobuf:protobuf-java:3.15.6' implementation 'com.google.protobuf:protobuf-android:3.15.6'
2.定義消息類型
protobuf的消息類型定義在.proto文件中。在Android studio中,可以在項目中創建一個.proto文件,並添加如下內容:
syntax = "proto3"; package com.example.protobufdemo; option java_package = "com.example.protobufdemo"; option java_outer_classname = "PersonModel"; message Person { string name = 1; int32 age = 2; repeated string hobbies = 3; }
該.proto文件定義了一個Person消息類型,包含了name、age和hobbies三個字段。其中,name的類型為字符串,age的類型為32位整數,hobbies的類型為字符串數組。
3.生成Java代碼
在.proto文件上右鍵,選擇”Generate Proto Java”,即可生成Java代碼。生成的Java代碼包含了兩個類,Person和PersonModel。Person是一個空類,用於在protobuf序列化時標識相應的消息類型。而PersonModel是一個工具類,提供了將Java對象轉換為protobuf數據和將protobuf數據轉換為Java對象的方法。
4.序列化和反序列化
下面是一個序列化和反序列化的例子:
//創建Person對象 Person person = new Person.Builder() .setName("Tom") .setAge(20) .addHobbies("reading") .addHobbies("music") .build(); //將Person對象轉換為protobuf數據 byte[] data = PersonModel.toByteArray(person); //將protobuf數據轉換為Person對象 Person newPerson = PersonModel.parseFrom(data);
該代碼創建了一個Person對象,並將其序列化為一個byte數組。之後,又將該byte數組反序列化為一個新的Person對象。通過這種方式,可以將Java對象和protobuf數據相互轉換。
三、Protobuf的優點
1.效率高
相較於XML和JSON,protobuf序列化後的數據更小、更快速。一方面,protobuf使用了二進制編碼,使得序列化後的數據更小;另一方面,protobuf在編寫時有嚴格的約束,使得序列化和反序列化的效率更高。
2.特別適合大數據處理
數據體積越大,傳輸效率越是關鍵。protobuf協議在處理大數據時,具有比XML和JSON更高的效率。Google在使用protobuf協議傳輸數據時,常常將數據先分塊再進行傳輸。
3.可擴展性好
protobuf允許在消息類型中添加新字段,而不會影響已有API的使用。這也是protobuf具有良好的可擴展性的原因。
4.跨平台性強
protobuf協議定義的消息類型以及相應的序列化和反序列化方法都是跨平台的,這也是protobuf的另一個優點。
四、總結
以上介紹了在Android平台上使用protobuf的一些方法和技巧,以及protobuf協議的優點。相信隨着應用場景的不斷擴展,protobuf協議會在更多領域發揮出它的優點。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/200657.html