java|idea中配合protobuf使用生成Java文件


关于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
java|idea中配合protobuf使用生成Java文件
文章图片

在idea里面配置protobuf Support File→Settings→Plugins→Browse repositonies→输入protobuf]
java|idea中配合protobuf使用生成Java文件
文章图片

安装好了之后,重启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格式 个人感觉 变不变都行 查略了一下
java|idea中配合protobuf使用生成Java文件
文章图片

2.在下面创建一个类,类名后要跟.proto点缀 如图:
java|idea中配合protobuf使用生成Java文件
文章图片

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文件 java|idea中配合protobuf使用生成Java文件
文章图片

测试
1. 复制生成的java文件到src/main下的java包目录java|idea中配合protobuf使用生成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. 运行 结果如下:
java|idea中配合protobuf使用生成Java文件
文章图片

本人刚到公司,刚接触protobuf,之前从没碰见过,求人无果,早上自己钻研 简单做个例子,如有大牛指教,请私信联系我。

    推荐阅读