概述
本文介绍google的protobuf框架的环境搭建以及使用它编写一个小demo。
配置proto编译器
如果要在window上使用proto编译器,需要下载针对window的编译器,本文使用的是:
protoc-3.3.0-win32.zip
解压完后,将protoc.exe编译器所在的路径设置到path路径上.
C:\sam\software\protobuf\bin
这点使用window的同学应该非常熟悉,这里不详细描述了。
配置完后可以使用:
protoc -h
验证一下是否配置成功。
引入proto-java包
如果是使用gradle构建的,依赖配置如下:
com.google.protobuf:protobuf-java:3.3.1
com.google.protobuf:protobuf-java-util:3.3.1
到此window使用protobuf的所需的东西已经齐全了。
编写proto文件
protobuf使用.proto文件来描述对象结构体的信息。这里用Student.proto为例子来说明如何定义对象以及对象属性。
Student.proto文件的位置
src/main/java/protobuf/firstdemo/Student.proto
syntax = "proto2";
package protobuf;
option optimize_for=SPEED;
option java_package="protobuf.firstdemo";
option java_outer_classname="ModelInfo";
message Student {
required string name = 1;
optional int32 age = 2;
optional string address = 3;
}
java_package:指定生成的java对象所在的java包;
java_outer_classname:生成的对象的名字,是外层对象,Student是其内部类;
messge:用message来声明对象,这里的message Student表示要生成Student对象;
使用proto编译器生成java对象
protoc –java_out=src/main/java src/main/java/protobuf/firstdemo/Student.proto
首先使用java_out指定对象要生成到哪个位置,java_out指定的参数加上.proto文件中的java_package的参数,
确定了对象生成的完整路径。如本文,对象将生成在
src/main/java/protobuf/firstdemo
指定.proto文件所在的位置。
src/main/java/protobuf/firstdemo/Student.proto
执行完上面的命令后,如果没有报出什么error信息,表示成功了。包里面会多出一个ModelInfo对象。
备注
CSDN的markdown工具老是把两个- 显示成一个-,刚才的java_out命令,前面是两个-。
测试ModelInfo对象
package protobuf.firstdemo;
import com.google.protobuf.InvalidProtocolBufferException;
import protobuf.firstdemo.ModelInfo.Student;
public class ModelInfoTest {
public static void main(String[] args) throws InvalidProtocolBufferException {
Student student = ModelInfo.Student.newBuilder()
.setName("Sam")
.setAge(34)
.setAddress("广州")
.build();
//转换成字节数组,而字节数组就可以在网络上传输了
//比如说:从客户端传输到服务端,从服务端传输到客户端
byte[] byteArray = student.toByteArray();
//从字节数组中反序列成对象
Student student2 = ModelInfo.Student.parseFrom(byteArray);
System.out.println(student2.getName());
System.out.println(student2.getAge());
System.out.println(student2.getAddress());
}
}
这段代码简单的演示了将对象变成字节数组以及从字节数组中反序列化成java对象。
总结
通过protobuf的编译器(版本2),基于proto文件,可以生成用于在网络上传输的对象,但是并没有生成编写客户端服务端代码的api类。实际上proto2是无法生成客户端和服务端代码的,这个只能使用基于proto3的grpc才能做到。
基于proto2这种情,如果想将proto生成的对象在网络上传输,还是需要借助一些工具,例如netty。具体请参考文章netty学习七:集成protobuf完成单个对象序列化以及在网络上传输
csdn code 路径
这个项目的源代码放置在csdn code上,欢迎访问。