文章目录

  • 一、导入依赖库
  • 二、构造 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 序列化与反序列化 | 三种序列化与反序列化性能对比 )相关推荐

  1. Kryo,Hessain,Protostuff三种序列化方式对比

    前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...

  2. 三种序列化方式性能比较

    一下代码比较了二进制序列化.xml序列化.Protobuf序列化的运行时间,可是代码显得十分冗余,是否有大神可以指点一二,万分感谢 using System; using System.Collect ...

  3. C# 的三种序列化方法

    序列化是将一个对象转换成字节流以达到将其长期保存在内存.数据库或文件中的处理过程.它的主要目的是保存对象的状态以便以后需要的时候使用.与其相反的过程叫做反序列化. 序列化一个对象 为了序列化一个对象, ...

  4. android 缩略图uri_课题_android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的 URI ,然后删除图片,小小总结一下获取 URI 的方法,亲自试 验在 android 4.1.3 的系统上都是可用的. 1. 将所有的图片路径取出,遍历比较 ...

  5. android 每隔2秒执行_Android中实现延迟执行操作的三种方法

    今天在敲代码的过程中,有个需求是延迟执行某方法. 整理收集了三种方法,自己用的是第三种. 第一种线程休眠:new Thread() { @Override public void run() { su ...

  6. android手机如何到导出电话号码,手机通讯录怎么导入到新手机?三种方法,快速迁移!...

    手机通讯录怎么导入到新手机?相信很多换手机的朋友心里都会有这样的疑惑,怎么才能快速又正确的把通讯录恢复?其实很简单,今天就分享给大家几种常见的方法,帮助大家在换手机的时候把通讯录导入到新手机. 方法一 ...

  7. 荣耀android手机怎么截图,荣耀5C手机如何截图截屏 荣耀5C三种截屏方法

    华为荣耀5C怎么截图呢?相信这是很多小白用户不太明白的.作为荣耀今年首款机型,荣耀5C凭借首发麒麟650处理器.金属机身设计以及指纹识别而备受关注,相信用户拿到真机之后在使用过程当中肯定会用到截图工具 ...

  8. 荣耀android手机怎么截图,华为荣耀8怎么截图/截屏 荣耀8三种截屏方法教程

    昨天晚上,荣耀带来了又一款小屏旗舰新机----荣耀8,主打高颜值外观.该机关于7月19日正式全国上市.相信小伙伴们拿到真机之后,在使用过程当中难免会使用截图分享.那么荣耀8怎么截图呢?下面脚本之家小编 ...

  9. android程序怎么导出到手机号码,手机电话号码怎么备份到微信(三种方法教你备份技巧)...

    SIM卡备份 采用SIM卡备份和还原是最原始,也是最通用的备份方法.将电话号码信息存在SIM卡中,优点是操作简单,不依赖其他三方软件与网络:缺点是存储号码数量受SIM卡容量限制. [好文分享:www. ...

最新文章

  1. matlab 灰色Verhulst预测模型
  2. 《Swift编程入门经典》
  3. Leetcode 189. 旋转数组 (每日一题 20210909)
  4. 5G NR 频率 带宽 栅格
  5. 外地买房,提取公积金
  6. Go语言交叉编译工具gox
  7. 今天的弹指一瞬间的飞鸽传书
  8. 吴恩达|机器学习作业目录
  9. SELinux系列(八)——SELinux默认安全上下文的查询和修改(semanage命令)
  10. 表贴电阻尺寸与什么有关_什么是LED点光源屏?常见的LED点光源规格和型号
  11. 怎样把网站js文件合并成一个?几种方法可以实现
  12. C/C++[算法入门]续
  13. 换了马甲也能认出“你” | 有了这个数据集,AI有望揪出变种勒索软件
  14. 高通平台环境搭建,编译,系统引导流程分析
  15. 自定义结构体及初始化
  16. HTML5 进阶系列:文件上传下载
  17. 智慧树知到等各大网课搜题接口及搜题公众号搭建教程
  18. python数据分析 - T检验与F检验:二组数据那个更好?(一)
  19. CHROME扩展笔记之webRequest·图片拦截
  20. Python将txt数据写入excel【分列】

热门文章

  1. 陶哲轩实分析 习题 10.3.5
  2. MIDlet 移动开发
  3. 《潜伏》走红背后的心理原因
  4. 简易而又灵活的Javascript拖拽框架(四)
  5. hello word 程序 ——简单的spring ioc 学习
  6. MariaDB 视图与触发器(11)
  7. C#枚举类型和结构体
  8. C#调用dll提示试图加载格式不正确的程序解决方法
  9. 分布式系统用户登录路由
  10. 移动端省际联动插件mobiscroll