文章目录

  • 一、Protobuf 序列化
  • 二、Protobuf 反序列化
  • 三、完整代码
  • 四、参考资料

一、Protobuf 序列化


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

序列化操作 : 调用 Protobuf 对象的 toByteArray 方法 , 可以将对象序列化为字节数组 ;

        // 将 addressBook 对象转为字节数组var bytes: ByteArray = addressBook.toByteArray()

序列化操作代码示例 :

        // 序列化操作var serializeStart = System.currentTimeMillis()// 将 addressBook 对象转为字节数组var bytes: ByteArray = addressBook.toByteArray()Log.i(TAG, "序列化耗时 ${System.currentTimeMillis() - serializeStart} ms , 序列化大小 ${bytes.size} 字节")

日志打印结果 :

2021-04-27 10:11:17.053 10000-10000/kim.hsl.protobuf I/MainActivity: 序列化耗时 4 ms , 序列化大小 34 字节

二、Protobuf 反序列化


反序列化操作 : 调用 Protobuf 对象的 parseFrom 方法 , 传入字节数组作为参数 , 可以字节数组反序列化为 Protobuf 对象 ;

var deserializeAddressBook: AddressBook = AddressBook.parseFrom(bytes)

反序列化操作代码示例 :

        // 反序列化操作var deserializeStart = System.currentTimeMillis()var deserializeAddressBook: AddressBook = AddressBook.parseFrom(bytes)Log.i(TAG, "反序列化耗时 ${System.currentTimeMillis() - serializeStart} ms")

日志打印结果 :

2021-04-27 10:11:17.056 10000-10000/kim.hsl.protobuf I/MainActivity: 反序列化耗时 7 ms

三、完整代码


完整代码示例 :

package kim.hsl.protobufimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.tutorial.protos.AddressBook
import com.example.tutorial.protos.Personclass MainActivity : AppCompatActivity() {companion object{val TAG = "MainActivity"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 创建 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() - serializeStart} ms")}}

执行结果 :

2021-04-27 10:11:17.053 10000-10000/kim.hsl.protobuf I/MainActivity: 序列化耗时 4 ms , 序列化大小 34 字节
2021-04-27 10:11:17.056 10000-10000/kim.hsl.protobuf I/MainActivity: 反序列化耗时 7 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 使用 ( Protobuf 序列化 | Protobuf 反序列化 )相关推荐

  1. protobuf message定义_巧用 Protobuf 反射来优化代码,拒做 PB Boy

    作者:iversonluo,腾讯 WXG 应用开发工程师 有些后台同学将自己称为 SQL Boy,因为负责的业务主要是对数据库进行增删改查.经常和 Proto 打交道的同学,是不是也会叫自己 PB B ...

  2. go protobuf v1败给了gogo protobuf,那v2呢?

    近期的一个项目有对结构化数据进行序列化和反序列化的需求,该项目具有performance critical属性,因此我们在选择序列化库包时是要考虑包的性能的. github上有一个有关Go序列化方法性 ...

  3. Android中的Serializable和Parcelable序列化

    Serializable和Parcelable接口都可以完成对象的序列化过程,在Android中当我们需要通过Intent和Binder传输数据时,我们要传输的对象就需要使用Serializable和 ...

  4. 招银网络二面:什么是序列化?常见的序列化协议有哪些?

    今天分享一道读者面试招银网络科技遇到的面试真题. 下面是正文. 序列化和反序列化相关概念 什么是序列化?什么是反序列化? 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网 ...

  5. java protostuff 序列化_使用Protostuff序列化

    序 rpc调用,有多种序列化的方式,通用如json,mongodb使用的bson:java方面的,比如Java默认的序列化,比如hessian:还有跨语言的,比如thrift.protocolbuf. ...

  6. java 序列化慢_java原生序列化慢在哪里?

    Java原生序列化和二进制序列化性能比较 序列化速度 package com.clq.netty.serializable; import java.io.ByteArrayOutputStream; ...

  7. php 接收序列化数据,PHP如何序列化数据?

    大多数情况下,我们需要将复杂的数组存储在数据库中或PHP中的文件中.有些人可能会使用PHP内置函数来完成这项任务.所谓复杂数组是具有多个数据类型或数组的元素的数组. 但是,我们已经有了一个方便的解决方 ...

  8. Java之什么是序列化以及为什么要序列化

    http://blog.csdn.net/tlycherry/article/details/8986720  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字 ...

  9. python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)

    一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...

  10. Atitit php序列化 php的serialize序列化和json序列化

    Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...

最新文章

  1. PHP 自定义session储存 数据库 方式类   高洛峰 细说PHP
  2. CISCO上ADSL配置的方法
  3. Mybaitis 缓存的优化
  4. Spring Cloud Finchley版中Consul多实例注册的问题处理
  5. mysql sql诊断建议_MySQL诊断调优常用SQL语句
  6. 高清 网络摄像机 华为海思3510芯片
  7. ArrayList的remove方法(重写equals方法) 与LinkedList的常用操作
  8. python与线性代数 线性方程组的解集
  9. jBPM4.4之流程引擎对象ProcessEngine
  10. Spring与Struts2的整合
  11. 基于SSH的共享笔记系统
  12. Maple入门使用教程
  13. 螺纹的规定,http://www.doc88.com/p-30089302852.html
  14. verilog语法基础
  15. 【Nginx】503 Service Temporarily Unavailable
  16. 一次计算机社团活动方案,社团活动方案设计方案5篇
  17. [c++]-uint8_t,uint16_t,uint32_t,uint64_t代表含义及其标准定义
  18. BDP个人版产品体验报告:在线数据分析使用心得
  19. facebook google qq企业邮箱 登陆
  20. 正则表达式的学习总结

热门文章

  1. 锤子辩论有感——我该如何定义成功
  2. 面向 Photoshop 的英特尔® Texture Works 插件
  3. hibernate学习(4)
  4. 字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
  5. vue项目中app.vue 、main.js和 index.html的关联
  6. CSS background属性
  7. hdu5643 King's Game(约瑟夫环+线段树)
  8. PAT (Basic Level) Practise:1012. 数字分类
  9. [BTS06]BizTalk2006 SDK阅读笔记(九) 业务活动监控
  10. javascript常用验证大全