Protobuf在IDEA中的使用

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("[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);
    }
}

Tset类的控制台输出如下


Demo效果基本完成,可以看到能将protobuf对象序列化成二进制数组,也能将二进制数组反序列化成protobuf对象.

更牛逼的是还能将protobuf对象转换成json!转换成json方便给前端使用.通过比较可以看出protobuf的大小只有json的1/3.

当然protobuf还有其他更多的优势.

以上就是protobuf在IDEA中的简单使用,本文只介绍了基本使用,更多的使用及原理,请自行百度学习!本人能力有限!



    





猜你喜欢

转载自blog.csdn.net/qq_39940205/article/details/80095302