Android中protobuf的使用
时间:2022-07-22
本文章向大家介绍Android中protobuf的使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
日常的总结,留作备忘。
Protobuf是一种灵活高效可序列化的数据协议,相于XML,具有更快、更简单、更轻量级等特性。支持多种语言,只需定义好数据结构,利用Protobuf框架生成源代码,就可很轻松地实现数据结构的序列化和反序列化。一旦需求有变,可以更新数据结构,而不会影响已部署程序。
使用Android studio3.2,在gradle中中配置:
在project的bulid.gradle中增加:
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.5'
在APP目录下的buid.gradle中,增加:
apply plugin: 'com.google.protobuf'
android {
sourceSets {
main {
// 定义proto文件目录
proto {
srcDir 'src/main/proto'
include '*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
}
dependencies {
//protobuf
implementation "com.google.protobuf:protobuf-java:3.1.0"
implementation ('com.squareup.retrofit2:converter-protobuf:2.2.0') {
exclude group: 'com.google.protobuf', module: 'protobuf-java'
}
}
//构建task
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.1.0'
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.builtins {
java {}
// Add cpp output without any option.
// DO NOT omit the braces if you want this builtin to be added.
}
}
}
//生成目录
generatedFilesBaseDir = "$projectDir/src/generated"
}
在src/main的目录下,建立文件夹proto,所有的proto文件,放置在这里。如:
syntax = "proto3";
option java_package = "com.newcapec.protobuf";
message gps_data {
int64 id = 1;
string terminalId = 2;
string dataTime = 3;
double lon = 4;
float speed = 6;
int32 gpsStatus = 9;
}
protobuf数据类型:
然后,点击Sync Project就可以在 Generate/debug/文件夹下自动生成GpsData.java文件啦。这个文件不要改动也无需改动。
最后给个使用的demo,序列化和反序列化:
package com.newcapec.testsqllite.protobuf;
import com.google.protobuf.InvalidProtocolBufferException;
import com.newcapec.protobuf.GpsData;
public class Test {
public static void main(String[] args){
GpsData.gps_data.Builder build = GpsData.gps_data.newBuilder();
build.setId(1);
build.setDataTime("20191018105706");
GpsData.gps_data info = build.build();
byte[] bt = info.toByteArray();
System.out.println(bt);
try {
info = GpsData.gps_data.parseFrom(bt);
System.out.println(info);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
输出结果:
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)
- 机器学习(六)— logistic回归
- 如果简化stm32中printf函数的使用——首先重定向
- TF-IDF算法(2)—python实现
- C语言定义数组时使用枚举作为数组的下标
- 机器学习(七)—回归
- C语言定义数组时使用枚举作为数组的下标 ——c99功能
- C语言——for循环和while循环的效率区别——类似哨兵思想
- 机器学习(八)—Apriori算法
- 机器学习(九)—FP-growth算法
- LeetCode — (1)
- Django初体验——搭建简易blog
- Python开发简单记事本
- 在stm32开发可以调用c标准库的排序和查找 qsort bsearch
- Python解析excel文件并存入sqlite数据库