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
在这里插入图片描述

3、检查是否配置成功

cmd 之后,输入

protoc

在这里插入图片描述

查看版本

protoc --version

在这里插入图片描述

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

三、idea 中使用 protobuf

1、idea 安装 protobuf 相关插件

安装这两个插件即可,安装之后重启 idea
一个是根据 .proto 文件来生成 proto 对象
一个是使得 idea 支持我们的 proto 语法,例如关键词高亮等功能
在这里插入图片描述

2、检查是否安装成功

重启之后我们可以在工具栏看到这两个选项
一个是配置全局的 protobuf
一个是生成所有的 protobuf 文件
在这里插入图片描述

3、配置全局 protobuf

protoc path :我们下载的 protobuf 编辑器的位置,在 bin 目录下有一个 .exe 文件
quick gen : 对应的语言,这里选择伟大的 Java
在这里插入图片描述

四、写一个简单的 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 的语法高亮(逼死强迫症,我当时也纠结了半天,是不是我写错了)
在这里插入图片描述

2、生成 proto 对象

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

在这里插入图片描述

尽管我们设置了生成目录,还是会生成到当前这个文件夹下,可自行研究下具体原因,我们复制到 java 文件夹下
在这里插入图片描述
生成后的 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);
    }

运行之后

在这里插入图片描述

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

五、继续深入

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

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

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

4、protobuf 与 Java 对象互转

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

  • 59
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值