文章目录
一、导入依赖库
二、构造 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