protobuf在IDEA中的基本使用.
使用插件的话,首先要下载安装Protobuf Support插件.(不用插件的话,有个比较繁琐的安装和转换过程,详见上一篇关于Protobuf的文章)
这是安装之后的截图,没安装的点击install安装重启IDEA即可.
接着需要对Protobuf Support插件进行配置.
maven的pom文件添加下面的代码
<!--protobuf相关start-->
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.grpc/grpc-all -->
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.11.0</version>
</dependency>
<!--protobuf相关end-->
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.5.0.Final</version>
</extension>
</extensions>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
配置完毕
现在开始写.proto文件,在src/main下面新建proto文件夹,文件夹的名字与上面的配置有关,采用的是默认的,所以名字不要乱改!
在proto里面新建file,后缀.proto
Student.proto代码如下
syntax = "proto3";
//生成文件所在包名
option java_package = "com.demo";
//生成的java文件名
option java_outer_classname = "ProtoDemo";
message Student {
int32 id = 1;
string name = 2;
string email = 3;
//枚举类
enum Sex {
MAN = 0;
WOMAN = 1;
}
Sex sex = 4 ;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
//内部类
message PhoneNumber {
string number = 1;
PhoneType type = 2 ;
}
//集合
repeated PhoneNumber phone = 5;
}
编写好.proto文件后,使用插件将proto文件转换为java文件
双击protobuf:compile即可
出现SUCCESS信息表示转换成功
然后在target/generated-sources/protobuf目录中即可找到生成的java文件
将ProtoDemo复制到src/main/java中你需要使用的位置即可
再建一个Test类进行测试.代码如下
package com.jm.domain;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import java.util.List;
/**
* @author jiangli
* @date 2018/4/26 14:44
* protobuf是一种数据交换的格式,以二进制的格式进行数据交换,主要用于网络传输、配置文件、数据存储等诸多领域
*/
public class Test {
public static void main(String[] args) {
//获取Student对象
//这里的Student对象构造器被私有化,我们通过Student的内部类Builder来构建builder
ProtoDemo.Student.Builder builder= ProtoDemo.Student.newBuilder();
//通过Student的内部类builder提供了构建Student相关属性的set方法
builder.setId(1);
builder.setName("凌晨0点0分");
builder.setEmail("31346337@qq.com");
builder.setSex(ProtoDemo.Student.Sex.MAN);
//获取PhoneNumber对象
ProtoDemo.Student.PhoneNumber.Builder builder1=ProtoDemo.Student.PhoneNumber.newBuilder();
builder1.setNumber("13657177663");
builder1.setType(ProtoDemo.Student.PhoneType.MOBILE);
ProtoDemo.Student.PhoneNumber pn=builder1.build();
builder.addPhone(pn);
//再创建1个PhoneNumber对象
pn=ProtoDemo.Student.PhoneNumber.newBuilder()
.setNumber("13581491939").setType(ProtoDemo.Student.PhoneType.HOME).build();
builder.addPhone(pn);
//序列化
ProtoDemo.Student stu=builder.build();
System.out.println("protobuf数据大小: " + stu.toByteString().size());
//再将封装有数据的对象实例,转换为字节数组,用于数据传输、存储等
byte[] stuByte = stu.toByteArray();
//这里得到了stuBte字节数组后,我们可以将该数据进行数据传输或存储,这里至于用什么技术传输就根据具体情况而定
//假如这里stuByt通过传输,下面的代码接到了该数据
//接收方 ,这里为了方便我们就写在一个类里面
//将字节数据反序列化为对应的对象实例
ProtoDemo.Student student=null;
try {
student= ProtoDemo.Student.parseFrom(stuByte);
//这里得到了Student实例了,就可以根据需要来操作里面的数据了
System.out.println("学生ID:"+student.getId());
System.out.println("姓名:"+student.getName());
System.out.println("性别:"+(student.getSex().getNumber()==0?"男":"女"));
System.out.println("邮箱:"+student.getEmail());
//遍历phoneNumber字段
List<ProtoDemo.Student.PhoneNumber> phList = student.getPhoneList();
for (ProtoDemo.Student.PhoneNumber p : phList) {
System.out.println(p.getType()+"电话:"+p.getNumber());
}
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
/*如何快速的进行json格式化*/
String jsonObject="";
try {
jsonObject= JsonFormat.printer().print(student);
} catch (InvalidProtocolBufferException e) {
e.getMessage();
}
System.out.println(jsonObject.toString());
System.out.println("json数据大小: "+jsonObject.getBytes().length);
}
}
Tset类的控制台输出如下
Demo效果基本完成,可以看到能将protobuf对象序列化成二进制数组,也能将二进制数组反序列化成protobuf对象.
更牛逼的是还能将protobuf对象转换成json!转换成json方便给前端使用.通过比较可以看出protobuf的大小只有json的1/3.
当然protobuf还有其他更多的优势.
以上就是protobuf在IDEA中的简单使用,本文只介绍了基本使用,更多的使用及原理,请自行百度学习!本人能力有限!