Android中protobuf的使用

简介: 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();
        }
    }
}


输出结果:


相关文章
|
21天前
|
Android开发
Android Uri转File方法(适配android 10以上版本及android 10以下版本)
Android Uri转File方法(适配android 10以上版本及android 10以下版本)
114 0
|
21天前
|
编解码 Ubuntu Java
Android 编译Android7.0版本源码
Android 编译Android7.0版本源码
|
Java 开发工具 Android开发
2017年伊始,你需要尝试的25个Android第三方库
2017年伊始,你需要尝试的25个Android第三方库
2017年伊始,你需要尝试的25个Android第三方库
|
安全 Java Linux
Android 简介【Android 专题 1】
Android 简介 Android 是一个基于Linux内核与其他开源软件的开放源代码的移动操作系统,由谷歌成立的开放手持设备联盟持续领导与开发。
159 0
Android 简介【Android 专题 1】
|
安全 Java 开发工具
android中ndk的开发
前言(其实是吐槽) 这是我看(android应用安全防护和逆向分析)遇到的第一个坑了,在章节2.1和2.2里,虽然作者很贴心的给了步骤教你如何搭建ndk的开发环境,但是,我要说的是,如果按照作者在2.1.2的五个步骤按部就班的来,你绝对!不可能!完成! 主要的原因我就不再分析了,大约就是少了一堆乱七八糟的说明和步骤,这里我重新写一遍ndk开发相关。
1200 0
|
Linux Android开发 中间件
Android 源码初步认识
1.源码结构 "BootLoader" u-boot.img MLO 连接硬件和操作系统的中间件,检测与配置硬件,启动操作系统 "uImage"  Linux内核,被u-boot识别引导 "ramdisk.
686 0

热门文章

最新文章