代码编织梦想

0x01 下载插件及编译器

1.下载IDEA插件

  • 依次点击IDEA中的File | Settings | Plugins,搜索Proto后安装对应插件

  • 包括ProtobufGenProtobuf,前者用于编辑proto文件,后者用于一键转换proto文件

image

2.下载编译器

下载地址:https://github.com/protocolbuffers/protobuf/releases

下载指定版本的protoc后解压即可

image

0x02 配置

1.配置Maven

pom.xml文件中添加如下依赖包:

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.18.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>3.18.0</version>
        </dependency>
    </dependencies>

2.配置GenProtobuf

IDEA菜单栏 --> Tools --> Configure GenProtobuf

image

配置相关信息

  • protoc path是下载的protoc.exe的地址。

  • 这里是将proto生成java类,因此生成对象选为java,并填写相应地址。

image

0x03 使用Protobuf

1.编辑proto

安装好Protocol Buffer Editor插件后,无需配置即可使用,由图可见,proto语法的关键字高亮显示了,便于编辑。

image

2.编译proto

右键proto文件,可以看见两个跟proto有关的选项,一个是quick gen protobuf here,另一个是quick gen protobuf rules。前者表示在proto所在的文件路径下生成java文件,后者表示按配置的地址生成java文件。

image

前文已经配置好了java生成的路径,我们选择后者生成即可,效果如图:

image

其中,MyTest即为test.proto生成的java类。

0x04 测试

生成了java类文件后,我们就可以测试其序列化和反序列化功能,如果可以正常运行并解析正确,说明我们的操作无误。

测试代码:

    package learnProto.selfTest;
     
    import com.google.protobuf.InvalidProtocolBufferException;
    import learnProto.selfTest.MyTest.*;
    import java.util.Arrays;
     
    public class Test {
        public static void main(String[] args) {
            convertProto(1);
        }
     
        public static void convertProto(int value) {
            //1.通过build创建消息构造器
            Data.Builder dataBuilder = Data.newBuilder();
            //2.设置字段值
            dataBuilder.setInt32(value);
            //3.通过消息构造器构造消息对象
            Data data = dataBuilder.build();
            //4.序列化
            byte[] bytes = data.toByteArray();
            System.out.println(value+"序列化后的数据:" + Arrays.toString(bytes)+",字节个数:"+bytes.length);
            //5.反序列化
            try {
                Data parseFrom = Data.parseFrom(bytes);
                System.out.println("还原后的数据="+parseFrom.getInt32());
            } catch (InvalidProtocolBufferException e) {
                e.printStackTrace();
            }
        }
    }

运行结果:

    1序列化后的数据:[24, 1],字节个数:2
    还原后的数据=1

0x05 应用

以上的内容足以应付一个简单的proto项目的一站式开发,但如果你正在处理一个较复杂的proto项目,项目中不仅有一个proto文件,其中可能包含多个,且之间有依赖关系,那么通过以上方法一键编译时(假设你写的proto文件的语法都正确),可能会遇到如下错误(即xxx.proto is not defined):

案例的框架如下:

image

data.proto代码如下:

    // Google Protocol Buffers Version 3.
    syntax = "proto3";
    // Package name.
    package prcticeProto.messages;
    // Options for code generation.
    option java_package = "learnProto.practiceTest.protoModel";
    option java_outer_classname = "SchoolModel";
    option java_multiple_files = true;
    // import packages
    import "google/protobuf/any.proto";
    import "practiceProto/categories/student.proto";
    message School {
      message Location{
        string name=1;
        uint32 id=2;
      }
      Location schoolLocation = 1;
      bool isOpen =2;
      repeated categories.Student allStudents = 3;
      google.protobuf.Any extend =4;
    }

student.proto代码如下:

    // Google Protocol Buffers Version 3.
    syntax = "proto3";
    // Package name.
    package prcticeProto.categories;
    // Options for code generation.
    option java_package = "learnProto.practiceTest.protoModel";
    option java_outer_classname = "StudentModel";
    option java_multiple_files = true;
    // import packages
    import "practiceProto/base/person.proto";
    message Student {
      base.Person baseInfo = 1;
      fixed32 calssId = 2;
      sint32 score = 3;
    }

person.proto代码如下:

    // Google Protocol Buffers Version 3.
    syntax = "proto3";
    // Package name.
    package prcticeProto.base;
    // Options for code generation.
    option java_package = "learnProto.practiceTest.protoModel";
    option java_outer_classname = "PersonModel";
    option java_multiple_files = true;
    message Person{
      message Location{
        string placeName=1;
        uint64 placeId=2;
      }
      enum Gender{
        man=0;
        woman=1;
      }
      string name = 1;
      int32 age=2;
      Gender gender=3;
      float height=4;
      double weight=5;
      Location location=6;
    }

从代码中可知,data依赖student,student依赖person。

注意:

  • package:指proto文件的包名

  • java_package:指proto生成的java文件的包名

  • java_outer_classname:指生成的java文件的类名

  • proto与proto之间的依赖关系通过import导入

在一键编译java类之前,需要将编辑好的proto文件,复制到protoc的include目录(从protoc path的地址可知protoc的地址,往上一级即可找到include目录)中:

image

再一键编译即可!

这一步就是解决上面说到的undefined问题的方法,因为proto文件中有import其他proto文件,那么你就得告诉编译器文件是什么,怎么告诉呢,就是将文件放在编译器的include目录中。

0x06 参考文档

https://segmentfault.com/a/1190000038778590

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mp9105/article/details/139050620

netty整合protobuf通讯_kkagr的博客-爱代码爱编程

使用idea可以安装protobuf的插件 不生效可以查一下是否和下面一样 添加pom文件 <dependencies> <dependency> <groupId

protobuf+java+spring boot+idea应用_double_q_y的博客-爱代码爱编程

什么是Protobuf? 1.Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准; 2.Protocol Buffers 是一种轻便高效的结构化数据存储格

netty(六):netty整合protobuf_luk流的博客-爱代码爱编程_netty整合protobuf

1. 配置protoBuf 在IDEA中安装检查编译proto的插件。 配置环境 下载protobuf编译环境,https://github.com/google/protobuf/releases 配置好环境变量。

protobuf在java中的应用-爱代码爱编程

一、protobuf的应用场景 在官方文档中可以看到 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 1

记一次SpringBoot2.x整合Kafka及ProtoBuf实现信息序列化传输-爱代码爱编程

前言 ProtoBuf简介 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 简单来讲, ProtoBuf 是结构数据序列化 方法,可简单类比于 XML,其具有以下特点: 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个

protobuf(一)认识protobuf-爱代码爱编程

认识protobuf 认识protobuf1、protobuf介绍2、protobuf语法3、为什么使用protobuf传输数据4、简单实践-通过java使用protobufa、首先,下载protobuf编译器b、在idea中配置protobuf环境c、具体实践 认识protobuf 1、protobuf介绍 Protocol Buffer

idea整合 protobuf_秋叶清风的博客-爱代码爱编程

安装插件 点击 file -> setting -> plugins -> 搜索protobuf,安装即可。小编已经安装过了,因此才会出现 disable 按钮引入依赖和build构建 <dependency> <groupId>com.google.protobuf</

protobuf3.0-爱代码爱编程

syntax="proto3"; option java_outer_classname="MonitorDataPojo"; option java_package="com.rhb.rpc.protobuf.pojo"; import public "google/protobuf/timestamp.proto"; message Monitor

从eclipse到intellij idea:顺畅过渡的关键注意点-爱代码爱编程

1 前言 大多数有多年工作的软件开发工程师,在前面时代使用的是Eclipse进行软件,随着时代在发展,越来越多的人使用的开发工具转型为IntelliJ IDEA。如果是一开始学习IDEA,从一张白纸开始,那么没有什么苦恼。

idea中好用的插件-爱代码爱编程

IDEA中好用的插件 CodeGeeXMybatis Smart Code Help ProAlibaba Java Coding Guidelines​(XenoAmess TPM)​ CodeGe