关于idea配置protobuf
- 关于protobuf
- Github下载protobuf Compiler
- 在idea里面配置protobuf Support
- 在idea里面创建一个maven项目
- 在idea里pom.xml配置相关依赖文件
- 在src/main下创建一个proto目录(一定要写正确格式proto)
- 将.proto文件转换为java文件
- 测试
关于protobuf Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化,常用于RPC 系统(Remote Procedure Call Protocol System)和持续数据存储系统。
其类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差,类似的还有json、Java的Serializable等。
很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
Github下载protobuf Compiler https://github.com/protostuff/protobuf-jetbrains-plugin/releases
文章图片
在idea里面配置protobuf Support File→Settings→Plugins→Browse repositonies→输入protobuf]
文章图片
安装好了之后,重启idea
在idea里面创建一个maven项目 具体步骤就不演示了,参考idea创建maven项目
在idea里pom.xml配置相关依赖文件
com.google.protobuf
protobuf-java
3.5.1
com.google.protobuf
protobuf-java-util
3.5.1
io.grpc
grpc-all
1.11.0
//先创建 在里面创建
kr.motd.maven
os-maven-plugin
1.5.0.Final
//之后再创建【java|idea中配合protobuf使用生成Java文件】org.xolstice.maven.plugins
protobuf-maven-plugin
0.5.0
com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
grpc-javaio.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier}
compile
compile-custom
在src/main下创建一个proto目录(一定要写正确格式proto) 1.将包文件变为Sources Root格式 个人感觉 变不变都行 查略了一下
文章图片
2.在下面创建一个类,类名后要跟.proto点缀 如图:
文章图片
3.Stdent.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文件转换为java文件
文章图片
测试
1. 复制生成的java文件到src/main下的java包目录
文章图片
2. 写出测试类
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 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);
}
3. 运行 结果如下:
文章图片
本人刚到公司,刚接触protobuf,之前从没碰见过,求人无果,早上自己钻研 简单做个例子,如有大牛指教,请私信联系我。
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)