前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )

【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )

作者头像
韩曙亮
发布2023-03-29 10:34:50
2.1K0
发布2023-03-29 10:34:50
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、导入依赖库


在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 ) 中 , 创建了 Protobuf 对象 , 本博客中将其序列化 , 保存到本地文件中 ;

导入 fastjson 与 gson 依赖库 , 即可使用两个 json 序列化与反序列化 API ;

代码语言:javascript
复制
    implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.alibaba:fastjson:1.1.67.android'

二、构造 JavaBean


参考 addressbook.proto 构造 JavaBean ,

代码语言:javascript
复制
// 指定 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

3

个 JavaBean , 构造结果如下 :

代码语言:javascript
复制
class PhoneNumber{
    enum class PhoneType{
        MOBILE,
        HOME,
        WORK;
    }
    var number: String = ""
    var type: PhoneType = PhoneType.MOBILE

    constructor(number: String, type: PhoneType) {
        this.number = number
        this.type = type
    }
}

class Person{
    lateinit var name: String
    var id: Int = 0
    var email: String = ""
    var phones: MutableList<PhoneNumber> = mutableListOf()

    constructor(name: String, id: Int, email: String, phones: MutableList<PhoneNumber>) {
        this.name = name
        this.id = id
        this.email = email
        this.phones = phones
    }
}

class AddressBook{
    var persons: MutableList<Person> = mutableListOf()
}

三、fastjson 序列化与反序列化


使用 fastjson 进行序列化与反序列化 :

代码语言:javascript
复制
        // 初始化 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)))
        )


        // 测试 fastjson

        var 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")

执行结果 :

代码语言:javascript
复制
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 进行序列化与反序列化 :

代码语言:javascript
复制
        // 初始化 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)))
        )

        // 测试 gson

        var 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")

执行结果 :

代码语言:javascript
复制
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、主界面代码

代码语言:javascript
复制
package kim.hsl.protobuf

import 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.Gson

class 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 测试代码

代码语言:javascript
复制
package kim.hsl.protobuf

import android.util.Log
import com.alibaba.fastjson.JSON
import com.google.gson.Gson

class 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)))
        )


        // 测试 fastjson

        var 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")




        // 测试 gson

        var 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.MOBILE

    constructor(number: String, type: PhoneType) {
        this.number = number
        this.type = type
    }
}

class Person{
    lateinit var name: String
    var id: Int = 0
    var email: String = ""
    var phones: MutableList<PhoneNumber> = mutableListOf()

    constructor(name: String, id: Int, email: String, phones: MutableList<PhoneNumber>) {
        this.name = name
        this.id = id
        this.email = email
        this.phones = phones
    }
}

class AddressBook{
    var persons: MutableList<Person> = mutableListOf()
}

3、执行结果

执行结果 :

代码语言:javascript
复制
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 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

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

六、参考资料


Protobuf 参考资料 :

博客源码 :

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、导入依赖库
  • 二、构造 JavaBean
  • 三、fastjson 序列化与反序列化
  • 四、gson 序列化与反序列化
  • 五、完整代码
    • 1、主界面代码
      • 2、JSON 测试代码
        • 3、执行结果
        • 六、参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档