Protocol Buffers解析用法

Protocol Buffers解析用法

此文以 Windows 为例,其他的都差不多。

1. windows 安装

  • protoc 下载:[官方下载地址],然后将 bin 路径添加到 path 环境变量下去 直接扔进(对于win64)C:\Windows
  • 查看是否安装成功:控制台输入 protoc --version ,控制台输出版本信息代表成功,如: libprotoc 3.7.1

2. ideal 安装插件

  • ideal 插件库搜索安装 Protobuf Support 即可
  • 此插件可以不用安装,但是这有助于一些源码阅读的便利性和一些编码提示

用法:Android Studio配置

// Appplication build.gradle
// 插件: 加入插件路径
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

// app build.gradle
// 应用插件
apply plugin: 'com.google.protobuf'

// 插件配置
android {
    ...
    sourceSets {
    main {
        java {
            srcDir 'src/main/java'// 生成java文件的输出路径
        }
        proto {
            srcDir 'src/main/proto'// 配置been文件的路径
        }
    }
}


protobuf {//插件配置
    //配置protoc编译器
    protoc {
        //与implementation 'com.google.protobuf:protobuf-java:3.11.1'版本号保持一致
        artifact = 'com.google.protobuf:protoc:3.11.1'
    }
    //这里配置生成目录,编译后会在build的目录下生成对应的java文件
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}
            }
        }
    }
}

dependencies {
    ...
    implementation 'com.google.protobuf:protobuf-java:3.11.1'
}

student.proto类:(java中的been类)

syntax = "proto3";//定义协议版本

option java_package = "com.appoa.myapplication.protobuf";//转换为Java类的包名
option java_outer_classname = "_StudentSerializable";//转换为Java类的类名

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

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

用法:测试TestProtoBuf

//测试
public class TestProtoBuf {

    public static void main(String... args) {
        //TODO:
        //序列化
        byte[] bs = serialize();
        System.out.println(Arrays.toString(bs));

        System.out.println("================反序列化====================");
        //反序列化
        _StudentSerializable._Student student = deserialize(bs);
        System.out.println(student);

    }
//
//
    public static byte[] serialize() {
        _StudentSerializable._Course.Builder courseBuild = _StudentSerializable._Course.newBuilder()
                .setName("语文")
                .setScore(66.5f);
        _StudentSerializable._Student.Builder builder = _StudentSerializable._Student.newBuilder();
        builder.setName("Av")
                .setAge(17).
                setSax("男").
                addCourses(courseBuild);
        _StudentSerializable._Student student = builder.build();
        return student.toByteArray();
    }
//
    public static _StudentSerializable._Student deserialize(byte[] bs) {
        try {
            return _StudentSerializable._Student.parseFrom(bs);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        return null;
    }
}

完成:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值