【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 序列化 | Protobuf 反序列化 )

简介: 【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.protobuf
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.tutorial.protos.AddressBook
import com.example.tutorial.protos.Person
class 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开发
Android 中使用Gson进行list集合的序列化与反序列化
Android 中使用Gson进行list集合的序列化与反序列化
187 0
|
JSON Java API
Android 中使用Gson完成对象的序列化与反序列化
Android 中使用Gson完成对象的序列化与反序列化
245 0
|
存储 开发框架 安全
Android 反序列化漏洞攻防史话
Java 在历史上出现过许多反序列化的漏洞,但大部分出自 J2EE 的组件。即便是 FastJSON 这种漏洞,似乎也很少看到在 Android 中被实际的触发和利用。本文即为对历史上曾出现过的 Android Java 反序列化漏洞的分析和研究记录。 # 前言 序列化和反序列化是指将内存数据结构转换为字节流,通过网络传输或者保存到磁盘,然后再将字节流恢复为内存对象的过程。在 Web 安全领域
437 0
Android 反序列化漏洞攻防史话
|
JSON fastjson Java
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(二)
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(二)
352 0
|
JSON fastjson 测试技术
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(一)
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(一)
366 0
|
JSON fastjson Java
Android 中的Json解析工具fastjson 、序列化、反序列化
Android中通常需要访问服务器,然而服务器返回的数据很多时候都是Json格式   1、fastjson简介      阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:    速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。
2260 0
|
2天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
4天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
6天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。