protobuf使用

protobuf为Google什么什么…(自行百度),总之重要的一点,它比Json和XML大体上会有更好的封装更小的体积。

AS配置

project的build.geadle

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        //...
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
        //加入gradle的依赖 
    }
}

小插曲
如果遇到以下错误:

A problem was found with the configuration of task ':app:generateDebugProto'.
> Directory '...ProtoBuffTest/app/build/extracted-include-protos/main' specified for property '$3' does not exist.

PS:这个错误是说在proto的build里面extracted-include-protos少了main这个文件夹,别问我为什么,我还没有去研究(应该是我protobuf编译生成那部分写的有问题),只是记录一下。你可以手动在extracted-include-protos这个里面加上,只要没有执行gradle clean那么之后都不会报这个错,也可以在工程或者app的build.gradle里面添加

ext{
    File file = new File("app/build/extracted-include-protos/main")//路径看你自己文件目录喽
    if (!file.exists()) {
        file.mkdirs()
    }
}

app build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf' //引入
...
 sourceSets{
        main{
            proto {
                srcDir 'src/proto'   //proto配置文件的路径
                include '**/*.proto'   //find it
            }
        }
    }
....
//依赖包
    implementation 'com.google.protobuf:protobuf-java:3.4.0'
    implementation 'com.google.protobuf:protoc:3.4.0'

//编译并生成
protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.4.0'
    }
    plugins {
        javalite {
            // The codegen for lite comes as a separate artifact
            artifact = 'com.google.protobuf:protobuf-java:3.4.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                // In most cases you don't need the full Java output
                // if you use the lite output.
                remove java
            }
            task.builtins {
                java {}
                cpp {}
            }
        }
    }
}

使用

配置完gradle就可以开心的使用了

这个过程有三个部分

  • 新建配置文件
  • 在业务里面使用之-封装
  • 在业务里面使用之-解析
    解析还可有花式的玩法,有同一个APP的解析,还有不同APP的解析
新建配置文件

比如说新建一个test.proto,它的位置按照build.gradle 里面应该是摆在如下的位置
proto loction
内容可以自己DIY喽

syntax = "proto3";
package proto;

message TestMessage{
    string type = 1;
    string typeStatus = 2;
    string flag = 3;
    int64 flagtime = 4;
    bytes data = 5;
    string network = 6;
    string config = 7;
    int32 width = 8;
    int32 height = 9;
}

对了这里应该插一张变量类型说明
这里用的是proto3,它还有2,,2是需要在特殊变量需求前面加修饰符的,太麻烦
在这里插入图片描述
如上的类型总结我是拿的这位仁兄的成果
或者自行去Google
写好这个之后就可以去build里面看一下它生成了没
build
就这样生成了。

封装
byte[] bytes = new byte[1024];
Test.TestMessage testMessage = Test.TestMessage
          .newBuilder()
          .setConfig("")
          .setData(ByteString.copyFrom(bytes))
          .setHeight(1)
          .build();
byte[] result = testMessage.toByteArray();

这样一个就封装好了
闲的蛋疼看一下它封装后的样子。
有如下数据:
data
上面已经表明了大小。下面先看一下Json封装,看看它的二进制是什么样的
Json

看起来完全显示,啥都能知道,下面是protobuf的封装:
protobuf
看起来就很喜庆。

解析(同APP解析)

因为是在一个APP里面,那么可以公用一套的protobuf的配置,只要你配置好就可以瞎用了

当拿到byte准备解析时

Test.TestMessage message= Test.TestMessage.parseFrom(data);

就是这么简单
PS:注意在遇到什么什么zero报错的时候,你要确定一下这个byte的包是否完整,这个是经常会出现的问题。

解析(不同APP)

如果是不同APP,是不是还要做前面一系列的配置呢?答案是否定的。
分两步:
1.把自己build(如上面配置步骤)出来的.java或者.cpp给对应app。
2.在对应APP的build.geadle 里面添加依赖

implementation 'com.google.protobuf:protobuf-java:3.4.0'

这样就可以用了

PS:还有些许的操作,当跨APP使用时,我们会发现在build出来的Test.java(就拿上面的配置举例)里面含有proto.Test这样的写法,那么当这个文件拷到别的app时,难道还需要建立相同的目录去放置使用么,那样真的是太麻烦了。于是产生了如下写法:

syntax = "proto3";
//package proto;

message TestMessage{
    string type = 1;
    string typeStatus = 2;
    string flag = 3;
    int64 flagtime = 4;
    bytes data = 5;
    string network = 6;
    string config = 7;
    int32 width = 8;
    int32 height = 9;
}

暂时去掉它的包名,然后make project,尽管会报错,但是它同样会在build下面生成Test.java的
test
这个时候你可以看到,在proto包里面的那个是原来配置里面加package的产出,屏蔽掉的是没在proto的Test.java,此时我们发现没在proto里面的那个.java文件里面是不包含proto.Test这样的函数的。这样就可以直接拷的别的APP里面用咯。

demo传送门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ProtobufProtocol Buffers)是一种轻量级的数据序列化格式,由Google开发。它可以用于结构化数据的序列化,用于数据通信、持久化和配置文件等场景。下面是使用protobuf的一般步骤: 1. 定义消息类型:使用protobuf语言定义文件(.proto)来描述数据结构和消息类型。你可以定义消息字段的名称、类型和规则等。 2. 编写.proto文件:在.proto文件中定义消息类型、字段和其他相关信息。例如,你可以定义消息的名称、字段的名称和类型、字段的规则(如必填、可选或重复)等。 3. 编译.proto文件:使用protobuf编译器将.proto文件编译为你所选编程语言的源代码。protobuf支持多种编程语言,如C++、Java、Python等。编译后会生成对应语言的源代码文件,其中包含与消息类型相关的类或结构体。 4. 在代码中使用protobuf:在你的代码中引入生成的源代码文件,并使用其中定义的类或结构体。你可以根据需要创建、修改和序列化protobuf消息,以及将其转换为二进制格式或其他格式。 5. 序列化和反序列化:使用protobuf库提供的方法将protobuf消息序列化为二进制格式,或者将二进制数据反序列化为protobuf消息。这样可以实现消息的传输和存储。 总结来说,使用protobuf可以实现跨语言、高效的数据序列化和反序列化,简化了数据传输和存储的过程。通过定义和编译.proto文件,并在代码中使用生成的源代码文件,你可以方便地使用protobuf进行数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值