1.什么是protobuff协议?
Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和Json数据差不多,把数据已某种形式保存起来.Protobuf相对与XML和Json的不同之处,它是一种二进制的数据格式,具有更高的传输,打包和解包效率.
2.protobuf在java方面的应用。
1):下载安装。https://download.csdn.net/download/antgan/9593735
2):配置环境变量。
3)设计对象
。。。。
4)描述对象
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
4.编译描述
cmd>protoc --java_out . xxx.proto
5.导入源代码到项目中
6.使用对象
三、 Eclipse新建项目
我使用maven构建protobuf项目,方便引入protobuf-java-2.5.0.jar依赖。
在项目根目录创建proto文件夹,存放proto文件。
这里写图片描述
maven依赖pom.xml
com.google.protobuf
protobuf-java
2.5.0
四、编写.proto文件
在proto文件夹下编写person-entity.proto,如下(proto协议的规则点这查看)
option java_outer_classname = "PersonEntity";//生成的数据访问类的类名
message Person {
required int32 id = 1;//同上
required string name = 2;//必须字段,在后面的使用中必须为该段设置值
optional string email = 3;//可选字段,在后面的使用中可以自由决定是否为该字段设置值
}
四、使用protoc.exe编译成java类
有两种方法:
- 使用Java Rumtime执行cmd命令
直接打开cmd运行命令也行。
使用Java Rumtime执行cmd命令
util包下新建GenerareClass类
这里写图片描述
/**
- protoc.exe
- @author ganhaibin
- */
public class GenerateClass {
public static void main(String[] args) {
String protoFile = "person-entity.proto";//
String strCmd = "d:/dev/protobuf-master/src/protoc.exe -I=./proto --java_out=./src/main/java ./proto/"+ protoFile;
try {
Runtime.getRuntime().exec(strCmd);
} catch (IOException e) {
e.printStackTrace();
}//通过执行cmd命令调用protoc.exe程序
}
}
命令格式如下。
protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件
1
- 直接打开cmd运行命令
这里写图片描述
生成的PersonEntity.java类
这里写图片描述
五、测试
编写Test类,模拟序列化和反序列化过程。
public class Test {
public static void main(String[] args) throws IOException {
//模拟将对象转成byte[],方便传输
PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
builder.setId(1);
builder.setName("ant");
builder.setEmail("ghb@soecode.com");
PersonEntity.Person person = builder.build();
System.out.println("before :"+ person.toString());
System.out.println("===========Person Byte==========");
for(byte b : person.toByteArray()){
System.out.print(b);
}
System.out.println();
System.out.println(person.toByteString());
System.out.println("================================");
//模拟接收Byte[],反序列化成Person类
byte[] byteArray =person.toByteArray();
Person p2 = Person.parseFrom(byteArray);
System.out.println("after :" +p2.toString());
}
}
输出如下
这里写图片描述