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


输出结果:


相关文章
|
存储 Java
Java堆和栈的区别和介绍以及JVM的堆和栈
Java堆和栈的区别和介绍以及JVM的堆和栈 一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。
6832 0
|
Linux
linux 交叉编译libpng,libjpeg库
linux 交叉编译libpng,libjpeg库
473 1
|
人工智能 API 开发工具
ModelScope魔搭12月版本发布月报
为了给开发者提供更便捷的开源模型API访问方式,我们正式启动了 ModelScope API-Inference 的公测。在开源工具链方面,我们进行了ModelScope 1.21.0的新版本发布,提供了llamafile的集成以及模型加载/下载链路的优化,SWIFT 3.0大版本也已经合并主干,在这个基础上新模型的支持会更加顺畅与便利。
580 3
ModelScope魔搭12月版本发布月报
|
Android开发
Cocos Creator 花了一个月入门经历
一个与人入门算是最笨的那种了吧 分享给大家入门视频教程
1289 0
Cocos Creator 花了一个月入门经历
|
缓存 前端开发 Linux
哇塞!NPM 缓存竟成开发拦路虎?快来掌握清空秘籍,开启前端开发逆袭之旅!
【8月更文挑战第20天】NPM是前端开发中管理依赖的关键工具。有时需清空其缓存以解决版本不一致或包损坏等问题,确保使用最新依赖。可通过命令`npm cache clean --force`强制清空全部缓存,或手动删除各系统下的缓存文件夹。注意清空缓存可能延长后续安装时间,建议事先备份依赖或确保可重新安装。正确管理缓存有助于提升开发效率。
738 1
|
XML 缓存 JavaScript
优化Java中的XML解析性能
优化Java中的XML解析性能
|
数据建模 程序员
程序员必知:ZVS振荡电路工作原理分析
程序员必知:ZVS振荡电路工作原理分析
342 1
|
机器学习/深度学习 人工智能 运维
智能化运维的崛起:自动化与人工智能在IT管理中的融合
本文深入探讨了智能化运维在现代企业中的重要性,并分析了自动化技术和人工智能(AI)如何共同推动IT运维管理的革新。文章首先概述了传统运维面临的挑战,然后详细介绍了智能化运维的核心概念和实施步骤,最后通过具体案例展示了智能化运维在实际工作中的应用效果和潜在价值。
405 0
|
存储 SQL 关系型数据库
认真学习MySQL中的那些日志文件-通用查询日志&错误日志
认真学习MySQL中的那些日志文件-通用查询日志&错误日志
1170 1