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

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 【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 3 33 个 JavaBean , 构造结果如下 :


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 进行序列化与反序列化 :


 

// 初始化 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")


执行结果 :

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)))
        )
        // 测试 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")


执行结果 :


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



相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
2月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
106 2
|
3月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
65 10
|
14天前
|
存储 JSON fastjson
再也不用心惊胆战地使用FastJSON了——序列化篇
本篇将主要介绍json序列化的详细流程。本文阅读的FastJSON源码版本为2.0.31。
|
10天前
|
算法 JavaScript Android开发
|
2月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
2月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
73 10
|
2月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
169 9
|
2月前
|
安全 Java 应用服务中间件
渗透测试-JBoss 5.x/6.x反序列化漏洞
渗透测试-JBoss 5.x/6.x反序列化漏洞
51 14
|
2月前
|
安全 Android开发 数据安全/隐私保护
安卓与iOS的对决:移动操作系统的性能与创新
在当今智能手机市场,安卓和iOS两大操作系统一直处于竞争状态。本文将深入探讨它们在性能、安全性和用户体验方面的不同,并分析这些差异如何影响用户的选择。
55 3