【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 序列化 | Protobuf 反序列化 )
文章目录
- 一、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 反序列化 )相关推荐
- protobuf message定义_巧用 Protobuf 反射来优化代码,拒做 PB Boy
作者:iversonluo,腾讯 WXG 应用开发工程师 有些后台同学将自己称为 SQL Boy,因为负责的业务主要是对数据库进行增删改查.经常和 Proto 打交道的同学,是不是也会叫自己 PB B ...
- go protobuf v1败给了gogo protobuf,那v2呢?
近期的一个项目有对结构化数据进行序列化和反序列化的需求,该项目具有performance critical属性,因此我们在选择序列化库包时是要考虑包的性能的. github上有一个有关Go序列化方法性 ...
- Android中的Serializable和Parcelable序列化
Serializable和Parcelable接口都可以完成对象的序列化过程,在Android中当我们需要通过Intent和Binder传输数据时,我们要传输的对象就需要使用Serializable和 ...
- 招银网络二面:什么是序列化?常见的序列化协议有哪些?
今天分享一道读者面试招银网络科技遇到的面试真题. 下面是正文. 序列化和反序列化相关概念 什么是序列化?什么是反序列化? 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网 ...
- java protostuff 序列化_使用Protostuff序列化
序 rpc调用,有多种序列化的方式,通用如json,mongodb使用的bson:java方面的,比如Java默认的序列化,比如hessian:还有跨语言的,比如thrift.protocolbuf. ...
- java 序列化慢_java原生序列化慢在哪里?
Java原生序列化和二进制序列化性能比较 序列化速度 package com.clq.netty.serializable; import java.io.ByteArrayOutputStream; ...
- php 接收序列化数据,PHP如何序列化数据?
大多数情况下,我们需要将复杂的数组存储在数据库中或PHP中的文件中.有些人可能会使用PHP内置函数来完成这项任务.所谓复杂数组是具有多个数据类型或数组的元素的数组. 但是,我们已经有了一个方便的解决方 ...
- Java之什么是序列化以及为什么要序列化
http://blog.csdn.net/tlycherry/article/details/8986720 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字 ...
- python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)
一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...
- Atitit php序列化 php的serialize序列化和json序列化
Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...
最新文章
- PHP 自定义session储存 数据库 方式类 高洛峰 细说PHP
- CISCO上ADSL配置的方法
- Mybaitis 缓存的优化
- Spring Cloud Finchley版中Consul多实例注册的问题处理
- mysql sql诊断建议_MySQL诊断调优常用SQL语句
- 高清 网络摄像机 华为海思3510芯片
- ArrayList的remove方法(重写equals方法) 与LinkedList的常用操作
- python与线性代数 线性方程组的解集
- jBPM4.4之流程引擎对象ProcessEngine
- Spring与Struts2的整合
- 基于SSH的共享笔记系统
- Maple入门使用教程
- 螺纹的规定,http://www.doc88.com/p-30089302852.html
- verilog语法基础
- 【Nginx】503 Service Temporarily Unavailable
- 一次计算机社团活动方案,社团活动方案设计方案5篇
- [c++]-uint8_t,uint16_t,uint32_t,uint64_t代表含义及其标准定义
- BDP个人版产品体验报告:在线数据分析使用心得
- facebook google qq企业邮箱 登陆
- 正则表达式的学习总结
热门文章
- 锤子辩论有感——我该如何定义成功
- 面向 Photoshop 的英特尔® Texture Works 插件
- hibernate学习(4)
- 字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
- vue项目中app.vue 、main.js和 index.html的关联
- CSS background属性
- hdu5643 King's Game(约瑟夫环+线段树)
- PAT (Basic Level) Practise:1012. 数字分类
- [BTS06]BizTalk2006 SDK阅读笔记(九) 业务活动监控
- javascript常用验证大全