java&Protocol Buffers
ps: Protocol Buffers简称PB
PB 安装配置
- 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 PB 2.5.0 版本。
- 安装 PB:
- 解压:
tar zxvf protobuf-2.5.0.tar.gz
,使用cd
命令进入protobuf-2.5.0
目录。 - ./configure,通常建议加上
--prefix
参数来指定目录,例如:./configure --prefix=/usr/local/Cellar/protobuf/2.5.0
- make,如出现
make: Nothing to be done for all
错误提示,表示 PB 已经被编译好了,如需重新编译,可以先用make clean
命令删除已经编译好的文件。 - make check
- make install
- 解压:
- 设置环境变量: 编辑
/etc/profile
,在文件末尾加入:
export PATH=$PATH:/usr/local/Cellar/protobuf/2.5.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Cellar/protobuf/2.5.0/lib
至此,PB已经成功安装完毕,可以使用 protoc --version
命令来验证是否安装成功,如果出现如下结果,则表示 PB 已经安装成功并且生效。
Intellij IDEA 安装 Protobuf 插件
通常我们在编写好 PB 文件之后,需要使用 protoc
来将 PB 文件编译成对应的代码,在命令行里面我们可以使用如下命令来生成对应的 Java 文件:
protoc --proto_path=src --java_out=build/gen src/myfolder
在 IDE 中编写 PB 文件之后,可以在指定 package 下一键生成对应的 Java 文件,方便对 Java 文件的管理。
Google Protocol Buffers support 就是有着上诉功能的 IDEA 插件。
-
安装 PB 插件。进入 IDEA 设置中心,打开
Plugins
,点击Browse repositories
,搜索protocol buffer
安装插件,如下图所示。安装好 PB 插件之后,需要重启 IDEA。 -
配置路径。PB 插件安装完毕之后,需要为插件配置 PB 的编译路径,也就是在上一步中我们安装的
protoc
。
至此,IDEA PB 插件安装完成,下面介绍如何在项目中使用 PB 插件来快速生成 Java 文件。
Java PB Demo
-
新建 Maven 项目,配置 PB 生成 Java 文件的目录:进入
Project Settings
,填写Output source directory
,这里的目录就是项目的Java source
目录。 -
根据 PB 描述文件,生成 Java 文件。在 PB 文件中右键,从菜单中选择
Compile ‘person.proto’
,就能生成对应的 Java 文件。
option java_package = "first.proto";
option java_outer_classname = "PersonModel";
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
- 加入 Maven 依赖。在 pom.xml 文件中加入如下依赖:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
序列化
PersonModel.Person.Builder personBuilder = PersonModel.Person.newBuilder();
personBuilder.setId(1);
personBuilder.setName("***");
personBuilder.setEmail("xxx@163.com");
PersonModel.Person person1 = personBuilder.build();
// 将数据写到输出流,如网络输出流,这里就用ByteArrayOutputStream来代替
ByteArrayOutputStream output = new ByteArrayOutputStream();
person1 .writeTo(output);
反序列化
byte[] byteArray = output.toByteArray();
// 接收到流并读取,如网络输入流,这里用ByteArrayInputStream来代替
ByteArrayInputStream input = new ByteArrayInputStream(byteArray);
PersonModel.Person person2= PersonModel.Person.parseFrom(input);
System.out.println("ID:" + person2.getId());
System.out.println("name:" + person2.getName());
System.out.println("email:" + person2.getEmail());