日常的总结,留作备忘。
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(); } } }
输出结果: