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;
}
}
完成: