Java 中使用 protobuf :入门基础篇,看这篇就够了!

一、什么是 protobuf ?

1、protobuf 来源?

Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。

2、官方解释

Protocol Buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序

3、如何更快理解 protobuf ?

protobuf 就是一个序列化数据和反序列化数据的方法,类似的还有 XML、Json、Java 的 Serializable 等。
但protobuf的效率高于XML、Json,不过protobuf生成的是字节码,可读性相比之略差

二、protobuf 环境配置

1、下载编译器

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

选择自己需要的版本下载即可,我这里下载的是 win64 3.15.3,下载之后进行解压

2、配置环境变量

path 系统变量中增加配置,也就是你的解压文件位置

D:\Developer\protoc-3.15.3-win64\bin
Java 中使用 protobuf :入门基础篇,看这篇就够了!_第1张图片

3、检查是否配置成功

cmd 之后,输入

protoc

Java 中使用 protobuf :入门基础篇,看这篇就够了!_第2张图片

查看版本

protoc --version

在这里插入图片描述

这样我们就可以在命令行去生成 proto 文件了,但是命令行太不方便,我就没有尝试了,直接上手 idea。

三、idea 中使用 protobuf

1、idea 安装 protobuf 相关插件

安装这两个插件即可,安装之后重启 idea
一个是根据 .proto 文件来生成 proto 对象
一个是使得 idea 支持我们的 proto 语法,例如关键词高亮等功能
Java 中使用 protobuf :入门基础篇,看这篇就够了!_第3张图片

2、检查是否安装成功

重启之后我们可以在工具栏看到这两个选项
一个是配置全局的 protobuf
一个是生成所有的 protobuf 文件
Java 中使用 protobuf :入门基础篇,看这篇就够了!_第4张图片

3、配置全局 protobuf

protoc path :我们下载的 protobuf 编辑器的位置,在 bin 目录下有一个 .exe 文件
quick gen : 对应的语言,这里选择伟大的 Java
Java 中使用 protobuf :入门基础篇,看这篇就够了!_第5张图片

四、写一个简单的 proto

创建一个简单的 springboot 项目或者 maven 项目
引入相关依赖,这里的依赖版本和我们的编辑器一个版本就好
maven 版本

 		<!--  protobuf 支持 Java 核心包-->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.15.3</version>
        </dependency>


        <!--  proto 与 Json 互转会用到-->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>3.15.3</version>
        </dependency>

gradle 版本

 	compile 'com.google.protobuf:protobuf-java:3.15.3'
    compile 'com.google.protobuf:protobuf-java-util:3.15.3'

1、编写 .proto 文件

在 resource 资源文件夹下面创建一个 proto 文件夹
新建一个 demo.proto
内容如下

//使用 proto3 语法 ,未指定则使用proto2
syntax = "proto3";

//生成 proto 文件所在包路径
package com.wxw.notes.protobuf.proto;

//生成 proto 文件所在包路径
option java_package = "com.wxw.notes.protobuf.proto";

//生成 proto 文件名
option java_outer_classname="DemoProto";

message Demo{
  //自身属性
  int32 id = 1;
  string code = 2;
  string name = 3;
}

如果发现有这种红色标识,千万不要以为是我们 Java 里面的异常错误,这只是 proto 的语法高亮(逼死强迫症,我当时也纠结了半天,是不是我写错了)
Java 中使用 protobuf :入门基础篇,看这篇就够了!_第6张图片

2、生成 proto 对象

选中我们新建的.proto 文件,右键,选择框中的选项就可以生成了

Java 中使用 protobuf :入门基础篇,看这篇就够了!_第7张图片

尽管我们设置了生成目录,还是会生成到当前这个文件夹下,可自行研究下具体原因,我们复制到 java 文件夹下
Java 中使用 protobuf :入门基础篇,看这篇就够了!_第8张图片
生成后的 proto 文件如下
在这里插入图片描述

3、protobuf 序列化和反序列化

package com.wxw.notes.protobuf.test;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.TextFormat;
import com.google.protobuf.util.JsonFormat;
import com.wxw.notes.protobuf.proto.DemoProto;

import java.util.Arrays;

public class SimpleTestMain {

    public static void main(String[] args) {

        //初始化数据
        DemoProto.Demo.Builder demo = DemoProto.Demo.newBuilder();
        demo.setId(1)
                .setCode("001")
                .setName("张三")
                .build();
                
        //序列化
        DemoProto.Demo build = demo.build();
        //转换成字节数组
        byte[] s = build.toByteArray();
        System.out.println("protobuf数据bytes[]:" + Arrays.toString(s));
        System.out.println("protobuf序列化大小: " + s.length);


        DemoProto.Demo demo1 = null;
        String jsonObject = null;
        try {
            //反序列化
            demo1 = DemoProto.Demo.parseFrom(s);
            //转 json
            jsonObject = JsonFormat.printer().print(demo1);

        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

        System.out.println("Json格式化结果:\n" + jsonObject);
        System.out.println("Json格式化数据大小: " + jsonObject.getBytes().length);
    }

运行之后

Java 中使用 protobuf :入门基础篇,看这篇就够了!_第9张图片

至此,一个简单的 protobuf 的就写好了。

五、继续深入

1、protobuf 有没有数据类型?protobuf 怎么与 Java 数据类型对应?

2、protobuf 怎么运用到我们的项目当中?复杂的 List、Map、内嵌对象等等怎么实现?

3、protobuf 怎么和 JSON 互相转换?

4、protobuf 与 Java 对象互转

请看下一篇:
你想要的我都有!

你可能感兴趣的:(protobuf,springboot,java)