Protocol Buffers
,是Google公司开发的一种数据描述语言,相似于XML可以将结构化数据序列化,可用于数据存储、通讯协议等方面。java
它不依赖于语言和平台而且可扩展性极强。现阶段官方支持C++
、JAVA
、Python
三种编程语言,但能够找到大量的几乎涵盖全部语言的第三方拓展包。git
google在2008年7月7号将其做为开源项目对外公布github
虽然Protocol Buffers
很早就被开源出来,被使用的频率并无Json
和XML
多,大多数被用于游戏开发协议,RPC
和即时通信.然而这样的数据交换利器比Json
和XML
的利处多太多了,但更小,更快,更简单编程
我知道光是想要使用Protocol Buffers,光是Android端是不够的,这里我写了对应SpringBoot集成Protocol Buffers是时候该了解一波Protocol Buffers了[Java]api
Android
项目不会添加默认输出,自Protobuf 3.0.0以来,protobuf-lite
是Android
推荐的Protobuf
库,您须要将其添加为代码生成插件。这样插件将代码生成到Android
指定的目录下网络
setup 1app
你须要添加protobuf lite到你的依赖中异步
dependencies {
// 你须要添加protobuf lite到你的依赖中,而再也不是protobuf-java
compile 'com.google.protobuf:protobuf-lite:3.0.0'
}
复制代码
setup 2maven
配置编译器,编译Gradle插件,文件输出环境编程语言
protobuf {
protoc {
// You still need protoc like in the non-Android case
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
javalite {
// The codegen for lite comes as a separate artifact
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
// In most cases you don't need the full Java output
// if you use the lite output.
remove java
}
task.plugins {
javalite { }
}
}
}
}
复制代码
setup 3
指定 proto文件所在文件夹,并不将.proto文件打入在APK中,这个步骤您也能够忽略
sourceSets {
main {
proto {
srcDir 'src/main/proto'
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
复制代码
setup 1
Android项目中编写.proto文件了.例如: 新建 Result.proto文件
package com.hk.protocolbuffer;
// 关注1:包名
option java_package = "com.hk.protocolbuffer";
option java_outer_classname = "Result";
// 关注2:option选项
// 关注3:消息模型
message AppResult {
optional string message = 1;
required string data = 2;
optional string version = 3;
optional string mobile = 5;
optional int32 code= 6[default = 500];
optional string email = 7;
}
复制代码
setup 2
而后从新构建,在项目的build\generated\source\proto\debug\javalite\com\hk\protocolbuffer下能找到生成的文件,收取成果
注意:
Protobuf Support
插件com\hk\protocolbuffer
目录是option java_package
指定的包名build\generated
目录生成的java文件都是能直接使用和打入到APK中的setup 1
添加retrofit2 格式转化器依赖,有 protobuf2
和protobuf3
两个版本的
compile 'com.squareup.retrofit2:converter-protobuf:2.1.0'
compile 'com.squareup.retrofit2:converter-protobuf:2.2.0'
setup 2
Retrofit
添加Protobuf
解析工厂
Retrofit.Builder builder = new Retrofit.Builder();
builder.addConverterFactory(new StringConverterFactory())//添加String格式化工厂
.addConverterFactory (ProtoConverterFactory.create())//添加Proto格式化工厂
.addConverterFactory(GsonConverterFactory.create(gson));//添加Gson格式化工厂
........
复制代码
setup 3
使用例子:
//定义接口
public interface GitHubService {
@Headers({"Content-Type:application/x-protobuf;charset=UTF-8","Accept: application/x-protobuf"})
@POST()
Call<Result.AppResult> psotTest(@Url String url,@Body Result.AppResult
appResult);
}
//获取实例
Retrofit retrofit = new Retrofit.Builder()
//设置OKHttpClient,若是不设置会提供一个默认的
.client(new OkHttpClient())
//设置baseUrl
.baseUrl("https://api.github.com/")
//添加Gson转换器
.addConverterFactory(ProtoConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
//异步请求
service.enqueue(new Callback<Result.AppResult>() {
@Override
public void onResponse(Call<Result.AppResult> call, Response<Result.AppResult> response) {
.......
}
@Override
public void onFailure(Call<Result.AppResult> call, Throwable t) {
.......
}
});
复制代码
注意:
proto2
和proto3
是不同的,converter
中用了反射的方法去获取字段的,因此须要使用相对应的版本ProtoConverterFactory
尽量的配置在Gson解析器的前面因为protobuf
调试比较头痛的问题,我在网上找到了一些调试工具(欢迎补充):
第一篇-网络篇:
第二篇-Retrofit源码解析
第三篇-Android组件化和快速实现MVP
第三篇-是时候该了解一波Protocol Buffers了[Android]
第四篇-是时候该了解一波Protocol Buffers了[Java]
更新中....
Github:github.com/chengzichen
CSDN : blog.csdn.net/chengzichen…
我的博客 : chengzichen.github.io/