文章目录
- 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。
官网: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类型
灵活长度int类型:int32, int64, uint32, uint64, sint32, sint64, bool, enum
64位固定长度类型:fixed64, sfixed64, double
可不定长度类型:string, bytes, repeated, map<K,V>, 或者引用其他路径message包
32位固定长度类型:fixed32, sfixed32, float
Protobuf编译器
下载
下载地址:https://github.com/protocolbuffers/protobuf/releases,如windows下,则win后缀的版本,到解压目录的protoc-xxx-win/bin/protoc.exe执行安装即可。
配置环境变量
配置环境变量即刻处处使用,选择环境变量->path->编辑->新建->将解压的bin目录路径放进去,然后确定应用。
使用指令验证:
protoc --version
编写一个入门程序
一般传输都是偏物联网或者聊天类的数据,所以我们模拟一个gps的对象
构建一个maven项目
pom加入:
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.12</version>
</dependency>
</dependencies>
结构如下,我们需要编写的是proto文件以及测试的java文件
编写步骤:
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
就自动生成
编写测试类:
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 反序列化生成对象结束 =====