Protocol Buffers
Protocol Buffers
就懒得介绍了,直接使用官网的介绍
协议缓冲区是Google的与语言无关,与平台无关,可扩展的机制,用于对结构化数据进行序列化–以XML为例,但更小,更快,更简单。 您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。
链接: Protocol Buffers使用,参考官网语法.
Android studio中配置Protocol Buffers
这个很简单,直接参考Google官方的介绍
链接:Googe官方在github上的插件介绍,会一一介绍Protocol Buffers使用.
1. 在Project的build.gradle中配置
2. 在app module或者其他module中配置
2.1. 首先引入插件
apply plugin: 'com.google.protobuf'
2.2. 在android{}中配置
这只是其中一种配置,直接参考链接:Googe官方在github上的插件介绍,会一一介绍Protocol Buffers使用.
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.8.0'
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
}
}
2.3. 引入Protocol Buffers的库
implementation 'com.google.protobuf:protobuf-javalite:3.15.6'
Protocol Buffers使用
首先将项目预览视图切换到Project,然后在src/main的Java同级目录中新建目录proto,
然后就可以在proto目录中编写Protocol Buffers的文件,文件以为.proto结尾
然后Android Studio也会自动提醒你安装预览插件和编辑插件,直接同意安装就行了,然后
就可以看到页面不是一片灰色了,而是跟代码编辑页面类似,有的关键字也会变色,哈哈
如下是我测试写的,使用参考Protocol Buffers的官网,介绍的很详细,英文不好就掏出我们的
翻译软件,嘿嘿
链接: Protocol Buffers使用,参考官网语法.
syntax = "proto3";
option java_package = "com.dh.verifyproject";
option java_outer_classname = "TestProto";
message UserRequest {
string username = 1;
string password = 2;
int32 age = 3;
enum Corpus {
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
LOCAL = 3;
NEWS = 4;
PRODUCTS = 5;
VIDEO = 6;
}
Corpus corpus = 4;
}
message UserResponse {
int32 errCode = 1;
string errMsg = 2;
UserRequest userRequest = 4;
enum EnumAllowingAlias {
// 添加这个属性为true,枚举可以设置相同的值
option allow_alias = true;
UNKNOWN = 0;
START = 1;
// 从生成的代码中我们可以看到, RUNNING = START
RUNNING = 1;
}
EnumAllowingAlias alias = 3;
enum Foo {
TEST = 0;
// reserved标记的都是不能使用的,防止enum中已经不能使用的值
// 只是被修改名字,但是值还是一样的引起其他问题
reserved 2, 15, 9 to 11, 40 to max;
reserved "FOO", "BAR";
}
}
message SearchRequest {
message SearchResult {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
repeated SearchResult result = 1;
}
message OtherSearchRequest {
// 使用另外一个message中的内部Message
SearchRequest.SearchResult result = 1;
}
// 使用Any任意类型
import "google/protobuf/any.proto";
message ErrorStatus {
string message = 1;
repeated google.protobuf.Any details = 2;
google.protobuf.Any anyData = 3;
}
message OneOfMessage {
// oneof修饰的属性,后设置的值会覆盖前一次的值,只会有一个值存在
oneof TestOneOf {
string name = 1;
int32 age = 2;
}
}
就是如下这么使用就好了,不熟悉的时候可以在用到的时候再去官网巩固学习下具体的语法
private void testProto() {
TestProto.UserRequest userRequest = TestProto.UserRequest.newBuilder()
.setUsername("张三")
.setPassword("123456")
.setAge(50)
.setCorpus(TestProto.UserRequest.Corpus.WEB)
.build();
byte[] bytes = userRequest.toByteArray();
Log.e(TAG, "转换为byte数组:: " + Arrays.toString(bytes));
try {
StringBuilder builder = new StringBuilder();
TestProto.UserRequest parseUserRequest = TestProto.UserRequest.parseFrom(bytes);
builder.append(parseUserRequest.getUsername())
.append(" ")
.append(parseUserRequest.getPassword())
.append(" ")
.append(parseUserRequest.getAge())
.append(" ")
.append(parseUserRequest.getCorpus());
Log.e(TAG, "转换为string:: " + builder.toString());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
private void testProto1() {
TestProto.UserResponse userResponse = TestProto.UserResponse.newBuilder()
.setErrCode(0)
.setErrMsg("登录失败")
.build();
byte[] bytes = userResponse.toByteArray();
Log.e(TAG, "转换为byte数组:: " + Arrays.toString(bytes));
try {
TestProto.UserResponse parseResponse = TestProto.UserResponse.parseFrom(bytes);
String str = parseResponse.getErrCode() + "--->"
+ parseResponse.getErrMsg();
Log.e(TAG, "转换为string:: " + str);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}