Protobuf详解

文章目录

    • Protobuf是什么
      • 传输协议类比
    • Protobuf协议语法
    • Protobuf类型
    • Protobuf编译器
      • 下载
      • 配置环境变量
    • 编写一个入门程序

Java是绝大多数人最常用的编程语言,那么作为Java开发如何学习protobuf呢?
步骤如下:

1.下载并安装 Protocol Buffers 工具:您需要从官方网站下载并安装 Protocol Buffers 工具,以便使用其中的 protoc 编译器。
2.学习 Protocol Buffers 的基本概念:了解 Protocol Buffers 是什么以及其基本概念,例如消息、字段和枚举等。
3.编写 .proto 文件:您需要使用 Protocol Buffers 的语言描述文件编写 .proto 文件来定义您的数据结构。
4.使用 protoc 编译器生成代码:使用 protoc 编译器将 .proto 文件转换为所需语言的源代码。
5.在 Java 中使用 Protocol Buffers:您可以在 Java 应用程序中使用 Protocol Buffers 生成的源代码,以便轻松地序列化和反序列化数据。
6.深入了解 Protocol Buffers:继续学习 Protocol Buffers 的高级特性,如嵌套消息、扩展和自定义选项等。
7.实践应用:通过实际应用案例来巩固您对 Protocol Buffers 的理解,并使用其提供的优势简化您的代码。

Protobuf是什么

Protobuf为Protocal Buffers的简写,是谷歌公司发明的一种传输协议。其是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。grpc应该大家都没少听说,其使用的就是protobuf。
Protobuf详解_第1张图片
官网:https://protobuf.dev/

传输协议类比

1.Xml
XML (Extensible Markup Language) 是一种类似于 HTML 的标记语言,但是 XML 没有使用预定义的标记。 因此,您可以根据自己的设计需求定义专属于您的标记。 这是一种十分有用的可存储、可搜索和可共享的格式存储数据的方法。
2.Json
JSON(JavaScript Object Notation, JS对象标记) 是一种轻量级的数据交换格式。它是基于 ECMAScript 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

3.Protobuf
Protobuf(Google Protocol Buffers),官方文档对 protobuf 的定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,可用于数据通信协议和数据存储等,它是 Google 提供的一个具有高效协议数据交换格式工具库,是一种灵活、高效和自动化机制的结构数据序列化方法。相比XML,有编码后体积更小,编解码速度更快的优势;相比于 Json,Protobuf 有更高的转化效率,时间效率和空间效率都是 JSON 的 3-5 倍。

Protobuf协议语法

Protobuf详解_第2张图片

消息字段的修饰符
Protobuf详解_第3张图片

Protobuf类型

灵活长度int类型:int32, int64, uint32, uint64, sint32, sint64, bool, enum

64位固定长度类型:fixed64, sfixed64, double

可不定长度类型:string, bytes, repeated, map, 或者引用其他路径message包 

32位固定长度类型:fixed32, sfixed32, float

Protobuf编译器

下载

下载地址:https://github.com/protocolbuffers/protobuf/releases,如windows下,则win后缀的版本,到解压目录的protoc-xxx-win/bin/protoc.exe执行安装即可。
Protobuf详解_第4张图片

配置环境变量

配置环境变量即刻处处使用,选择环境变量->path->编辑->新建->将解压的bin目录路径放进去,然后确定应用。

使用指令验证:
protoc --version

Protobuf详解_第5张图片

编写一个入门程序

一般传输都是偏物联网或者聊天类的数据,所以我们模拟一个gps的对象

构建一个maven项目
pom加入:

<dependencies>
        <dependency>
            <groupId>com.google.protobufgroupId>
            <artifactId>protobuf-javaartifactId>
            <version>3.21.12version>
        dependency>
    dependencies>

结构如下,我们需要编写的是proto文件以及测试的java文件
Protobuf详解_第6张图片
编写步骤:

syntax = "proto3";

option java_package = "com.demo.protoimpl";

message gps_data {
  int64 id = 1;

  string terminalId = 2;

  string dataTime = 3;

  double lon = 4;

  double lat = 5;

  float speed = 6;

  int32 altitude = 7;

  int32 locType = 8;

  int32 gpsStatus = 9;

  float direction = 10;

  int32 satellite = 11;

}

在项目路径下执行指令,使用protoc编译:

protoc -I=src/main/resources/proto --java_out=src/main/java gps_data.proto

就自动生成
Protobuf详解_第7张图片
编写测试类:

public class TestGpsProtobuf {
    public static void main(String[] args) {

        System.out.println("===== 构建一个GPS模型开始 =====");

        GpsData.gps_data.Builder builder = GpsData.gps_data.newBuilder();
        builder.setAltitude(1);
        builder.setDataTime("2023-01-17 16:00:00");
        builder.setGpsStatus(1);
        builder.setLat(39.124);
        builder.setLon(120.116);
        builder.setDirection(50.2F);
        builder.setId(50L);

        GpsData.gps_data gpsData = builder.build();
        System.out.println(gpsData.toString());

        System.out.println("===== 构建GPS模型结束 =====");

        System.out.println("===== gps Byte 开始=====");
        GpsData.gps_data gd = null;

        try {
            gd =GpsData.gps_data.parseFrom(gpsData.toByteArray());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        System.out.println(String.valueOf(gd));

        System.out.println("===== 使用gps 反序列化生成对象结束 =====");

    }

}

结果:

===== 构建一个GPS模型开始 =====
id: 50
dataTime: "2023-01-17 16:00:00"
lon: 120.116
lat: 39.124
altitude: 1
gpsStatus: 1
direction: 50.2

===== 构建GPS模型结束 =====
===== gps Byte 开始=====
id: 50
dataTime: "2023-01-17 16:00:00"
lon: 120.116
lat: 39.124
altitude: 1
gpsStatus: 1
direction: 50.2

===== 使用gps 反序列化生成对象结束 =====

你可能感兴趣的:(java,开发语言)