今天看看ProtoBuf序列话工具,可以说它相对于 json 格式来说性能更好,传输数据量比较大的时候可以考虑使用 protobuf 。
Android Studio 中如何使用呢?
有两种方法 一:采用命令行编译后获取.java文件copy 到项目中进行使用
二:添加AS插件 在构建项目的时候进行编译并生成.java类文件。
由于我没有安装Xcode 所以想看看使用AS 的情况
https://github.com/protocolbuffers/protobuf/tree/master/java
首先 我们下载AS 的 protobuf 插件
![](https://img.haomeiwen.com/i5833616/7bf96462f8cb7dd3.png)
app build.gradle 中加入依赖
![](https://img.haomeiwen.com/i5833616/62c029ec47285866.png)
设置 sourceSets
sourceSets {
main {
proto {
//main目录新建proto目录
srcDir 'src/main/proto'
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
引入 gradle protobuf 插件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
配置 task
protobuf { //protobuf生成的配置
protoc {
artifact = 'com.google.protobuf:protoc:3.2.0'
}
plugins {
javalite {
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
generateProtoTasks {
all()*.plugins {
javalite { }
}
}
}
![](https://img.haomeiwen.com/i5833616/33dc5d0052721af8.png)
编译后 创建一个 address.proto文件,根据文档语法编写结构信息
syntax = "proto2";// proto 版本
package tutorial;
option java_package = "com.example.tutorial";//自己项目的包名
option java_outer_classname = "AddressBookProtos";//生成.java的文件名
//Person 类型 编号必须不相同 否则会报错
message Person {
//required 必填项 序列化数据源必须提供 string 类型 对应 java String 编号1
required string name = 1;
//required 必填项 int32 类型 对应 java int 编号2
required int32 id = 2;
//optional 可选项 string 类型 对应 java String 编号3
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
//repeated 重复项 类似数组的形式
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
Java 下的详细说明(翻墙)
rebuild 一下项目就可以再 build/generated/下找到 AddressBookProtos.java了
![](https://img.haomeiwen.com/i5833616/bac3b739187bf654.png)
可以看到包名 与 .proto文件中 package 字段一致。
try {
//反序列化 将 byte[] 转为 java 类对象
AddressBookProtos.Person person=
AddressBookProtos.Person.parseFrom(new byte[100]);
//序列化一个 person 对象到 byte[]
byte[] bytes = person.toByteArray();
//徒手创建一个新的 person 对象
AddressBookProtos.Person.Builder builder =
AddressBookProtos.Person.newBuilder();
builder.setEmail("xxxxxx@.com");
//......
AddressBookProtos.Person newPerson = builder.build();
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
下一篇看一下 gradle 中编译 proto 的任务以及 proto 插件的相关知识吧
网友评论