android studio(火烈鸟版本)使用protobuf

news2024/11/25 6:27:30

一、简介

Protobuf 全称:Protocol Buffers,是 Google 推出的一种与平台无关、语言无关、可扩展的轻便高效的序列化数据存储格式,类似于我们常用的 xml 和 json。

二、特点

Protobuf 用两个字总结:小,快。用 Protobuf 序列化后的大小是 json 的十分之一,是 xml 格式的二十分之一,而且性能是他们的 5~100 倍。
通常情况下,我们使用 xml 或者 json 进行数据通信是没什么问题的,但是在高性能和大数据通信的情况下,如果有办法压缩数据量,提高传输效率,显然会给用户带来更快更流畅的体验,因此做 LiveChat 自研,Protobuf 成为我们进行数据传输的第一选择。

三、语法

Protobuf 常用关键字介绍
在这里插入图片描述

Protobuf 基本数据类型

暂时无法在飞书文档外展示此内容

基本数据类型默认值
暂时无法在飞书文档外展示此内容

protobuf文本示例:

//指定Protobuf版本
syntax = "proto3";
//指定包名
package com.example.testprotobuf;
//指定生成的类所在的包名位置
option java_package = "com.example.testprotobuf.internal";
option java_outer_classname = "AudioAcousticMngtProto";

message BandGain {
    uint32 bandID = 1;
    int32 gain = 2;
}

message Equalizer {
//repeated相当于集合类
    repeated BandGain bandGainList = 1;
}

message Equalizerstruct {
    uint32 bandnumber = 1;
    uint32 groupID = 2;
    Equalizer equalizer = 3;
}

message ProtoInt8 {
    int32 value = 1;
}

message ProtoUint8 {
    uint32 value = 1;
}

message ProtoBool {
    bool value = 1;
}

message ProtoString {
    string value = 1;
}

//注意:
//1、一个 Protobuf 文件里面可以添加多个消息类,也可以进行嵌套
//2、上面的 1,2,3,4 并不是给字段赋值,而是给每个字段定义一个唯一的编号。这些编号用于二进制格式中标识你的字段,并且在使用你的消息类型后不应更改
//3、1-15 的字段编号只占一个字节进行编码,16-2047 的字段编号占两个字节,包括字段编号和字段类型,因此建议更多的使用 1-15 的字段编号
//4、可以指定最小字段编号为 1,最大字段编号为 2^29 - 1 或 536870911。另外不能使用 19000-19999 的标识号,因为 protobuf 协议实现对这些进行了预留,同样,也不能使用任何以前保留(reserved) 的字段编号

四、具体使用

//配置环境:
//app目录下得build.gradle:
plugins {
    id 'com.android.application'
    id 'com.google.protobuf'
}

android {
 ......
    sourceSets {
        main {
            //实际测试指不指定无所谓,不影响 Java 文件生成
            proto {
                srcDir 'src/main/proto'
            }
        }
    }
}

protobuf {
    //配置 protoc 编译器
    protoc {
        artifact = 'com.google.protobuf:protoc:3.21.7'
    }
    //配置生成目录,编译后会在 build 的目录下生成对应的java文件
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}
            }
        }
    }
}


dependencies {
    implementation 'com.google.protobuf:protobuf-java:3.21.7'
    //....
}


//根目录下:build.gradle:
plugins {
    id 'com.android.application' version '8.0.2' apply false
    id 'com.android.library' version '8.0.2' apply false
    id 'com.google.protobuf' version '0.9.3' apply false
}
//java代码:示例序列化的过程
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public byte[] toByteArray() {
        AudioAcousticMngtProto.BandGain bandGain = AudioAcousticMngtProto.BandGain.newBuilder().setGain(1).setBandID(2).build();
        AudioAcousticMngtProto.Equalizer equalizer = AudioAcousticMngtProto.Equalizer.newBuilder().addBandGainList(bandGain).build();
        AudioAcousticMngtProto.Equalizerstruct proto_output = AudioAcousticMngtProto.Equalizerstruct.newBuilder().setBandnumber(3)
                .setGroupID(3)
                .setEqualizer(equalizer)
                .build();
        return proto_output.toByteArray();
    }
    public static AudioAcousticMngtProto.Equalizerstruct fromByteArray(byte[] data) {
        AudioAcousticMngtProto.Equalizerstruct equalizerstruct =null;
        try {
            return equalizerstruct = AudioAcousticMngtProto.Equalizerstruct.parseFrom(data);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        return equalizerstruct;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS 裁剪工具及工具栏配置讲解

我们还是日常打开PS软件 首先 我们右侧菜单中右键 找到裁剪工具组 当我们选择裁剪工具时 图像边上会出现一个白色的框框 用法比较简单 我们可以鼠标拖住一个边 然后 往里拖动 将不要的东西剪掉 然后 鼠标双击 即可保存结果 然后 我这里撤回一下 这些部分还有用 还有一个…

安装nvm管理node

1.首先卸载已存在的node cmd输入node提示:‘node’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 2.安装nvm 安装地址 :Releases coreybutler/nvm-windows GitHub 本人选择1.1.7 输入nvm打印出了nvm的指令列表,说明…

【Nodejs】原生nodejs路由、获取参数、静态目录

1.路由 index.js // 启动服务 const server require(./server.js); //路由模块 const route require(./route.js); //api const apiRouter require(./api.js);server.use(route); server.use(apiRouter); server.start();server.js const http require(http);//创建一个大…

“解锁高效水资源管理:灌区管理系统一图详解“

平台概述 柳林灌区管理系统平台以物理灌区为单元、时空数据为底座、数学模型为核心、水利知识为驱动,对物理灌区全要素和建设运行全过程进行数字映射、智能模拟、前瞻预演,与物理灌区同步仿真运行、虚实交互、迭代优化,实现对物理灌区的实时…

ChatGPT和搜索引擎哪个更好用

目录 ChatGPT和搜索引擎的概念 ChatGPT和搜索引擎的作用 ChatGPT的作用 搜索引擎的作用 ChatGPT和搜索引擎哪个更好用 总结 ChatGPT和搜索引擎的概念 ChatGPT是一种基于对话的人工智能技术,而搜索引擎则是一种用于在互联网上查找和检索信息的工具。它们各自具…

脑电信号处理与特征提取——2.脑电的神经起源与测量(夏晓磊)

目录 二、脑电的神经起源与测量 2.1 脑电的神经起源 2.2 脑电的测量 二、脑电的神经起源与测量 2.1 脑电的神经起源 脑电起源于大脑皮层大量神经元的同步突触活动,主要贡献来自锥体细胞。 静息电位:内负外正,K内流。 动作电位&…

stm8s003_切换时钟流程分析、配置外部晶振(库函数调用)

1、stm8s003的时钟 复位后,默认使用内部高速时钟HSI(16MHz)的8分频,也就是2MHz. 代码开始运行,也就是运行到main函数,我们就可以修改时钟源为外部晶振。 2、切换时钟流程分析,参考官方应用手册…

联想拯救者Y9000X 2023 i9+32G+RTX4070,真香!

拯点新品!i932GRTX4070,真香! 联想拯救者Y9000X 2023搭载16英寸专业超竞屏,机身最薄处仅为17.6mm,轻盈即刻随行,让你开黑随时开始! 高刷新率,高分辨率,广色域,高亮度。强…

如何有效跟踪你的计费时间?

对于自由职业者、小型企业和远程团队来说,时间跟踪是必需的。了解自己在单个项目或任务上投入了多少时间,可以帮助他们有效管理资源和优化工作流程。 然而,在向客户收费时,时间跟踪多了一层复杂性:不仅需要跟踪所花费…

【论文阅读】DEPIMPACT:反向传播系统依赖对攻击调查的影响(USENIX-2022)

Fang P, Gao P, Liu C, et al. Back-Propagating System Dependency Impact for Attack Investigation[C]//31st USENIX Security Symposium (USENIX Security 22). 2022: 2461-2478. 攻击调查、关键边、入口点 开源:GitHub - usenixsub/DepImpact 目录 1. 摘要2. 引…

re学习(23)BUUCTF 刮开有奖(中间变量的获取)

INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) {const char *v4; // esiconst char *v5; // ediint v7[2]; // [esp8h] [ebp-20030h] BYREF 虽然看名称不连续,但是通过看偏移地址,可知,这些变量在内存中是连续的&…

3.python设计模式【工厂模式】

1.简单工厂模式 内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品的实例。角色: 工厂角色(creator)抽象产品角色(product)具体产品角色 UML图 : 举个例…

Go基础快速入门

目录 一、变量相关基础语法 1、变量的定义以及赋值 2、变量的交换 3、匿名变量 4、变量的作用域 二、常量 三、基本数据类型 1、常见数据类型 2、数据类型的转换 四、运算符 五、函数 函数高级用法 函数也是一个类型 函数也是一个变量,也可以赋值 高…

视频监控汇聚平台EasyCVR视频监控录像的3种方式介绍

视频监控综合管理平台EasyCVR可以实现海量资源的接入、汇聚、计算、存储、处理等,平台具备轻量化接入能力,可支持多协议方式接入,包括主流标准协议GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Eho…

STM32MP157驱动开发——按键驱动(tasklet)

文章目录 “tasklet”机制:内核函数定义 tasklet使能/ 禁止 tasklet调度 tasklet删除 tasklet tasklet软中断方式的按键驱动程序(stm32mp157)tasklet使用方法:button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “tasklet”机制: …

谁说dubbo接口只能Java调用,我用Python也能轻松稿定

由于公司使用基于Java语言的Dubbo技术栈,而本人对Python技术栈更为熟悉。为了使不懂JAVA代码的同学也能进行Dubbo接口层的测试,总结一个通过python实现dubbo接口调用的实现方案。 01、实现原理 根据Dubbo官方文档中提到的:dubbo可以通过tel…

裂缝处理优化策略

裂缝缺陷检测:检测道路中的裂缝,无项目背景 数据:分为两类,正常、裂缝 方案介绍 数据预处理 将原始数据标签处理为两类,正常和裂缝原始图片均为320*480,使用的显卡为2080,内存足够,不进行图片大小调整模型后处理 二分类使用softmax处理,使用最大值作为结果分类效…

操作系统第五章 错题整理

5.1 设备控制器也就是IO控制器 A对于一些简单的IO设备 控制他也许用不到IO寄存器 B 只是设备控制器与CPU(主机)交互的接口 D 只是 接口 C 对IO控制器所接收到的CPU的信息进行译码 并送到外设中 IO逻辑是个芯片 数据通路是逻辑上的 实际上还是通过总线 …

SpringBoot复习:(2)Tomcat容器是怎么启动的?

SpringApplication的run方法包含如下代码: 其中调用的refreshContext代码如下: 其中调用的refresh方法片段如下: 其中调用的refresh方法代码如下: 其中调用的super.refresh方法代码如下: public void refresh() th…

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…