记录 protobuf gradle plugin 生成 序列化

2019-07-27  本文已影响0人  RenHaiRenWjc

众所周知,xml 和 json 常见的、应用广泛的序列化和反序列化协议,而 google 自家出产的 Protobuf 也是具备了优秀协议所需要的众多典型特征。

那在 android 如何简单快捷地使用 protobuf 呢

android 提供了一个插件 protobuf gradle plugin,在构建时生成序列化文件

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

apply plugin: 'com.google.protobuf'  //声明插件
. . .
android {
    . . .
    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            proto {
                srcDir 'src/main/protoBean'  // proto 文件位置
            }
        }
    }

}
protobuf {  //配置 proto 编译器
    protoc {
        artifact = 'com.google.protobuf:protoc:3.5.1'  //注意 这里版本号需要与 protobuf-java lib 一致
    }
    //这里配置生成目录,编译后会在 build\generated\source\proto 的目录下生成对应的java文件
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}
            }
        }
    }
}
dependencies{
       . . .
     implementation 'com.google.protobuf:protobuf-java:3.5.1' //依赖 protobuf-java lib
}
syntax = "proto3";

option java_package = "com.wjc.jcdemolist.demo.protoBuf";
option java_outer_classname = "_StudentSerializable";

message _Student {
    //指定字段的类型 定义字段的编号,在Protocol Buffers中,字段的编号非常重要
    // 字段名仅仅是作为参考和生成代码用。需要注意的是字段的编号区间范围,
    //其中19000 ~ 19999被Protocol Buffers作为保留字段
    string name = 1;
    string sax = 2;
    int32 age = 3;
    //required指定该字段必须赋值,禁止为空(在v3中该约束被移除);optional指定字段为可选字段,可以为空,
    //对于optional字段还可以使用[default]指定默认值,如果没有指定,则会使用字段类型的默认值
    repeated _Course course = 4; //使用repeated指定字段为集合

}
//在一个proto文件中可以同时定义多个message类型,生成代码时根据生成代码的目标语言不同,
//处理的方式不太一样,如Java会针对每个message类型生成一个.java文件
message _Course {
    string name = 1;
    float score = 2;
}

proto 语法这里就不说讲啦,如需要详情了解,自个百度吧
注意在项目 build.gradle 中,需要把这个文件路径放入配置中

生了 protobuf java ,那如何用呢,请看下面

public static byte[] serialize() {
    _StudentSerializable._Course.Builder courseBuilder = _StudentSerializable._Course.newBuilder()
            .setName("中文").setScore(149);
    _StudentSerializable._Student.Builder studentBuilder = _StudentSerializable._Student.newBuilder();
    studentBuilder.setName("Jc").setAge(16).setSax("man").addCourse(courseBuilder);
    _StudentSerializable._Student student = studentBuilder.build();
    return student.toByteArray();
}

public static _StudentSerializable._Student deserialize(byte[] bs) {
    try {
        return _StudentSerializable._Student.parseFrom(bs);
    } catch (InvalidProtocolBufferException e) {
        e.printStackTrace();
    }
    return null;
}

使用起来,是很简单吧,序列化使用 builder 模式,而反序列化一行代码就行了


上一篇 下一篇

猜你喜欢

热点阅读