【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )
文章目錄
- 一、導入依賴庫
- 二、構造 JavaBean
- 三、fastjson 序列化與反序列化
- 四、gson 序列化與反序列化
- 五、完整代碼
- 1、主界面代碼
- 2、JSON 測試代碼
- 3、執行結果
- 六、參考資料
一、導入依賴庫
在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源碼分析 | 創建 Protobuf 對象 ) 中 , 創建了 Protobuf 對象 , 本博客中將其序列化 , 保存到本地文件中 ;
導入 fastjson 與 gson 依賴庫 , 即可使用兩個 json 序列化與反序列化 API ;
implementation 'com.google.code.gson:gson:2.8.2'implementation 'com.alibaba:fastjson:1.1.67.android'二、構造 JavaBean
參考 addressbook.proto 構造 JavaBean ,
// 指定 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; }需要構造 AddressBook , Person , AddressBook 333 個 JavaBean , 構造結果如下 :
class PhoneNumber{enum class PhoneType{MOBILE,HOME,WORK;}var number: String = ""var type: PhoneType = PhoneType.MOBILEconstructor(number: String, type: PhoneType) {this.number = numberthis.type = type} }class Person{lateinit var name: Stringvar id: Int = 0var email: String = ""var phones: MutableList<PhoneNumber> = mutableListOf()constructor(name: String, id: Int, email: String, phones: MutableList<PhoneNumber>) {this.name = namethis.id = idthis.email = emailthis.phones = phones} }class AddressBook{var persons: MutableList<Person> = mutableListOf() }三、fastjson 序列化與反序列化
使用 fastjson 進行序列化與反序列化 :
// 初始化 kim.hsl.protobuf.AddressBook 對象var addressBook: AddressBook = AddressBook()addressBook.persons = mutableListOf(Person("Tom", 0, "", mutableListOf(PhoneNumber("666", PhoneNumber.PhoneType.MOBILE))),Person("Jerry", 1, "", mutableListOf(PhoneNumber("888", PhoneNumber.PhoneType.MOBILE))))// 測試 fastjsonvar fastjsonStart = System.currentTimeMillis()// fastjson 序列化 : 將 addressBook 轉為 json 字符串var jsonString: String = JSON.toJSONString(addressBook)// 將字符串轉為 Byte 數組var bytes = jsonString.toByteArray()Log.i(MainActivity.TAG, "fastjson 序列化耗時 ${System.currentTimeMillis() - fastjsonStart} ms , " +"序列化大小 ${bytes.size} 字節")fastjsonStart = System.currentTimeMillis()// 序列化操作JSON.parseObject(String(bytes), com.example.tutorial.protos.AddressBook::class.java)Log.i(MainActivity.TAG, "fastjson 反序列化耗時 ${System.currentTimeMillis() - fastjsonStart} ms")執行結果 :
2021-04-27 22:51:02.539 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 序列化耗時 21 ms , 序列化大小 169 字節 2021-04-27 22:51:02.568 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 反序列化耗時 29 ms四、gson 序列化與反序列化
使用 gson 進行序列化與反序列化 :
// 初始化 kim.hsl.protobuf.AddressBook 對象var addressBook: AddressBook = AddressBook()addressBook.persons = mutableListOf(Person("Tom", 0, "", mutableListOf(PhoneNumber("666", PhoneNumber.PhoneType.MOBILE))),Person("Jerry", 1, "", mutableListOf(PhoneNumber("888", PhoneNumber.PhoneType.MOBILE))))// 測試 gsonvar gsonStart = System.currentTimeMillis()// gson 序列化 : 將 addressBook 轉為 json 字符串jsonString = Gson().toJson(addressBook)// 將字符串轉為 Byte 數組bytes = jsonString.toByteArray()Log.i(MainActivity.TAG, "gson 序列化耗時 ${System.currentTimeMillis() - gsonStart} ms , " +"序列化大小 ${bytes.size} 字節")gsonStart = System.currentTimeMillis()Gson().fromJson(String(bytes), com.example.tutorial.protos.AddressBook::class.java)Log.i(MainActivity.TAG, "gson 反序列化耗時 ${System.currentTimeMillis() - gsonStart} ms")執行結果 :
2021-04-27 22:51:02.597 16698-16698/kim.hsl.protobuf I/MainActivity: gson 序列化耗時 29 ms , 序列化大小 169 字節 2021-04-27 22:51:02.609 16698-16698/kim.hsl.protobuf I/MainActivity: gson 反序列化耗時 12 ms五、完整代碼
1、主界面代碼
package kim.hsl.protobufimport androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import com.alibaba.fastjson.JSON import com.example.tutorial.protos.AddressBook import com.example.tutorial.protos.Person import com.google.gson.Gsonclass MainActivity : AppCompatActivity() {companion object{val TAG = "MainActivity"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 測試 Protobuf 性能protobufTest()// 測試 Json 性能JsonTest().jsonTest()}fun protobufTest(){// 創建 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() - deserializeStart} ms")}}
2、JSON 測試代碼
package kim.hsl.protobufimport android.util.Log import com.alibaba.fastjson.JSON import com.google.gson.Gsonclass JsonTest {fun jsonTest(){// json 測試// 初始化 kim.hsl.protobuf.AddressBook 對象var addressBook: AddressBook = AddressBook()addressBook.persons = mutableListOf(Person("Tom", 0, "", mutableListOf(PhoneNumber("666", PhoneNumber.PhoneType.MOBILE))),Person("Jerry", 1, "", mutableListOf(PhoneNumber("888", PhoneNumber.PhoneType.MOBILE))))// 測試 fastjsonvar fastjsonStart = System.currentTimeMillis()// fastjson 序列化 : 將 addressBook 轉為 json 字符串var jsonString: String = JSON.toJSONString(addressBook)// 將字符串轉為 Byte 數組var bytes = jsonString.toByteArray()Log.i(MainActivity.TAG, "fastjson 序列化耗時 ${System.currentTimeMillis() - fastjsonStart} ms , " +"序列化大小 ${bytes.size} 字節")fastjsonStart = System.currentTimeMillis()// 序列化操作JSON.parseObject(String(bytes), com.example.tutorial.protos.AddressBook::class.java)Log.i(MainActivity.TAG, "fastjson 反序列化耗時 ${System.currentTimeMillis() - fastjsonStart} ms")// 測試 gsonvar gsonStart = System.currentTimeMillis()// gson 序列化 : 將 addressBook 轉為 json 字符串jsonString = Gson().toJson(addressBook)// 將字符串轉為 Byte 數組bytes = jsonString.toByteArray()Log.i(MainActivity.TAG, "gson 序列化耗時 ${System.currentTimeMillis() - gsonStart} ms , " +"序列化大小 ${bytes.size} 字節")gsonStart = System.currentTimeMillis()Gson().fromJson(String(bytes), com.example.tutorial.protos.AddressBook::class.java)Log.i(MainActivity.TAG, "gson 反序列化耗時 ${System.currentTimeMillis() - gsonStart} ms")}}class PhoneNumber{enum class PhoneType{MOBILE,HOME,WORK;}var number: String = ""var type: PhoneType = PhoneType.MOBILEconstructor(number: String, type: PhoneType) {this.number = numberthis.type = type} }class Person{lateinit var name: Stringvar id: Int = 0var email: String = ""var phones: MutableList<PhoneNumber> = mutableListOf()constructor(name: String, id: Int, email: String, phones: MutableList<PhoneNumber>) {this.name = namethis.id = idthis.email = emailthis.phones = phones} }class AddressBook{var persons: MutableList<Person> = mutableListOf() }
3、執行結果
執行結果 :
2021-04-27 22:51:02.513 16698-16698/kim.hsl.protobuf I/MainActivity: 序列化耗時 4 ms , 序列化大小 34 字節 2021-04-27 22:51:02.515 16698-16698/kim.hsl.protobuf I/MainActivity: 反序列化耗時 2 ms2021-04-27 22:51:02.539 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 序列化耗時 21 ms , 序列化大小 169 字節 2021-04-27 22:51:02.568 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 反序列化耗時 29 ms2021-04-27 22:51:02.597 16698-16698/kim.hsl.protobuf I/MainActivity: gson 序列化耗時 29 ms , 序列化大小 169 字節 2021-04-27 22:51:02.609 16698-16698/kim.hsl.protobuf I/MainActivity: gson 反序列化耗時 12 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
總結
以上是生活随笔為你收集整理的【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】360 加固后的运行错误 (
- 下一篇: 【Android Protobuf 序列