文章目录
简介
- Protocol buffers 是一种语言无关,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。Protocol buffers 很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
- protocol buffers 诞生之初是为了解决服务器端新旧协议(高低版本)兼容性问题,名字也很体贴,“协议缓冲区”。只不过后期慢慢发展成用于传输数据
- 版本:目前 protocol buffers 最新版本是 proto3,与老的版本 proto2 的 API 不完全兼容。 proto中所有结构化的数据都被称为 message
使用入门
安装
-
mac安装,下载安装包https://github.com/google/protobuf/releases
1. 下载protoc-3.10.0-osx-x86_64.zip 2. 解压 3. 配置环境变量 export PROTOBUF=/Volumes/P/develope/protoc-3.10.0-osx-x86_64/ export PATH=$PATH:$PROTOBUF/bin source ~/.zshrc
准备
-
生成前的目录结构
├── build.gradle └── src ├── main │ ├── java │ ├── proto │ │ └── UserProtobuf.proto │ └── resources │ └── logback.xml └── test ├── java └── resources
-
Protobuf 编译器通过描述文件(.proto文件)生成对应于语言的代码,代码中定义了消息类型、获取、设置、编解码序列化等操作。这也是为什么 Protobuf 支持跨语言传输,因为消息所有端共用一个通用的描述文件。
UserProtobuf.proto
内容如下://proto3语法注解:默认是proto2,这必须是文件的第一个非空的非注释行。 syntax = "proto3"; //生成的包名 option java_package = "cn.jannal.protobuf"; //生成的java类名 option java_outer_classname = "User"; message UserProto{ //ID int32 id = 1; //姓名 string name = 2; //年龄 int32 age = 3; //状态 int32 state = 4; }
生成并运行java代码
-
第一种方式:直接通过命令行生成java,使用
protoc
工具可以把编写好的proto
文件生成不同的语言代码。对Java来说,编译器为每一个消息类型生成了一个.java文件,以及一个特殊的Builder类(该类是用来创建消息类接口的)。对javaNano来说,JavaNano是专门为资源受限系统(如Android)设计的特殊代码生成器和运行时库, 代码量和运行时开销都非常资源友好-I 后面是 proto 文件所在目录 --java_out 后面是 java 文件存放地址 最后一行是 proto 文件名称 protoc -I=src/main/proto --java_out=src/main/java UserProtobuf.proto
-
第二种方式:通过gradle插件生成,插件地址https://github.com/google/protobuf-gradle-plugin。可以在build之前根据proto文件自动生成java文件
buildscript { repositories { mavenLocal() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10' } } subprojects { apply plugin: 'java' apply plugin: 'com.google.protobuf' sourceCompatibility = 1.8 targetCompatibility = 1.8 idea { module { downloadJavadoc = true downloadSources = true } } dependencies { compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.10.0' } //==============protobuf配置================ sourceSets { main { proto { //默认是 'src/main/proto' srcDir 'src/main/proto' } } test { proto { // 默认 'src/test/proto' srcDir 'src/test/proto' } } } protobuf { protoc { //从仓库下载 artifact = 'com.google.protobuf:protoc:3.10.0' //生成代码的目录 generatedFilesBaseDir = "$projectDir/src" } } //在build之前执行proto代码生成 build.dependsOn(":$project.name:generateProto") //==============protobuf配置================ }
-
生成后的目录结构
. ├── build.gradle └── src ├── main │ ├── java │ │ └── cn │ │ └── jannal │ │ └── protobuf │ │ └── User.java │ ├── proto │ │ └── UserProtobuf.proto │ └── resources │ └── logback.xml └── test ├── java │ └── cn │ └── jannal │ └── protobuf │ └── UserTest.java └── resources
-
测试程序
public class UserTest { private static final Logger logger = LoggerFactory.getLogger(UserTest.