idea中配合protobuf使用生成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]
File→Settings→Plugins→Browse repositonies→输入protobuf
安装好了之后,重启idea

在idea里面创建一个maven项目

具体步骤就不演示了,参考idea创建maven项目

在idea里pom.xml配置相关依赖文件

 <dependencies>
    <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-->
    </dependencies>
//先创建<build></build>在里面创建<extensions></extensions>
<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.5.0.Final</version>
        </extension>
    </extensions>
    //之后再创建<plugins></plugins>
    <plugins>
        <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>

    </plugins>
</build>

在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("[email protected]");
        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);
    }

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

猜你喜欢

转载自blog.csdn.net/weixin_44000871/article/details/88532787
今日推荐