文章目录
一、导入依赖库二、构造 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")
执行结果 :
-04-27 22:51:02.539 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 序列化耗时 21 ms , 序列化大小 169 字节-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")
执行结果 :
-04-27 22:51:02.597 16698-16698/kim.hsl.protobuf I/MainActivity: gson 序列化耗时 29 ms , 序列化大小 169 字节-04-27 22:51:02.609 16698-16698/kim.hsl.protobuf I/MainActivity: gson 反序列化耗时 12 ms
五、完整代码
1、主界面代码
package kim.hsl.protobufimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Logimport com.alibaba.fastjson.JSONimport com.example.tutorial.protos.AddressBookimport com.example.tutorial.protos.Personimport 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.Logimport com.alibaba.fastjson.JSONimport 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、执行结果
执行结果 :
-04-27 22:51:02.513 16698-16698/kim.hsl.protobuf I/MainActivity: 序列化耗时 4 ms , 序列化大小 34 字节-04-27 22:51:02.515 16698-16698/kim.hsl.protobuf I/MainActivity: 反序列化耗时 2 ms-04-27 22:51:02.539 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 序列化耗时 21 ms , 序列化大小 169 字节-04-27 22:51:02.568 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 反序列化耗时 29 ms-04-27 22:51:02.597 16698-16698/kim.hsl.protobuf I/MainActivity: gson 序列化耗时 29 ms , 序列化大小 169 字节-04-27 22:51:02.609 16698-16698/kim.hsl.protobuf I/MainActivity: gson 反序列化耗时 12 ms
六、参考资料
Protobuf 参考资料 :
Protobuf 官网主页 :/protocol-buffers
Protobuf 语法指南 :/protocol-buffers/docs/proto
Protobuf Java 语言对应用法 :/protocol-buffers/docs/javatutorial
Protobuf 下载地址 :/protocol-buffers/docs/downloads
Protobuf 源码地址 :/protocolbuffers/protobuf
Protobuf 发布版本下载地址 :/protocolbuffers/protobuf/releases
protobuf-gradle-plugin 项目地址 :/google/protobuf-gradle-plugin
博客源码 :
GitHub 地址 :/han120/Protocol_BuffersCSDN 快照 :/download/han120/18181938
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )