Protobuf Java使用详解

Protobuf(Protocol Buffers,以下简称PB)是Google开发的一种数据序列化协议,可以用于数据存储、通信协议等场景,具有高效、快速、简单的特点。在Java开发中,我们可以使用PB库将数据序列化成二进制数据,也可以将二进制数据反序列化成原始数据。

一、安装与配置

1、环境要求: JDK 8或以上。

2、下载依赖包: 我们可以从Maven仓库中下载PB Java的依赖包,使用如下的Maven依赖进行配置:

<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.17.3</version>
</dependency>

3、生成Java代码: 使用PB时需要定义.proto文件,这个文件描述了数据结构。我们可以使用protoc工具从这个文件生成Java代码。首先,下载对应版本的protoc编译器:

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protoc-3.17.3-linux-x86_64.zip

4、生成Java代码:

sudo apt-get install unzip
unzip protoc-3.17.3-linux-x86_64.zip
./bin/protoc --version
./bin/protoc --java_out=. your.proto

其中,your.proto是你自己定义的.proto文件。

二、使用方式

1、定义message:在.proto文件中,我们可以定义message,这个message有两种类型字段:

//example.proto
syntax = "proto3";
package com.example.demo;
option java_package = "com.example.demo.proto";
option java_outer_classname = "ExampleProto";
message ExampleMessage {
  int32 age = 1; //int32类型,字段名为age,字段ID为1
  string name = 2; //string类型,字段名为name,字段ID为2
  repeated string hobbies = 3; //repeated表示数组类型,字段名为hobbies,字段ID为3
}

2、使用message:在Java代码中,我们可以创建ExampleMessage对象,并设置字段值。

//Demo.java
ExampleProto.ExampleMessage.Builder builder = ExampleProto.ExampleMessage.newBuilder();
builder.setAge(18);
builder.setName("John Doe");
builder.addHobbies("reading");
builder.addHobbies("running");
ExampleProto.ExampleMessage message = builder.build();

3、序列化和反序列化:我们可以将ExampleMessage对象序列化成二进制数据,并将二进制数据反序列化成ExampleMessage对象。

//序列化
byte[] bytes = message.toByteArray();
//反序列化
ExampleProto.ExampleMessage message2 = ExampleProto.ExampleMessage.parseFrom(bytes);

三、高级特性

1、消息嵌套

PB中支持消息嵌套,可以构建更复杂的数据模型。

//example.proto
syntax = "proto3";
package com.example.demo;
option java_package = "com.example.demo.proto";
option java_outer_classname = "ExampleProto";
message Hobby {
  string name = 1;
  int32 level = 2;
}
message ExampleMessage {
  int32 age = 1;
  string name = 2;
  repeated Hobby hobbies = 3;
}

在上面的例子中,Hobby作为ExampleMessage的一个字段类型,实现了消息嵌套。在Java代码中,我们可以如下设置Hobby:

//Demo.java
ExampleProto.Hobby.Builder hobbyBuilder = ExampleProto.Hobby.newBuilder();
hobbyBuilder.setName("reading");
hobbyBuilder.setLevel(3);
ExampleProto.Hobby hobby = hobbyBuilder.build();
builder.addHobbies(hobby);

2、枚举类型

在PB中,我们可以定义枚举类型字段。

//example.proto
syntax = "proto3";
package com.example.demo;
option java_package = "com.example.demo.proto";
option java_outer_classname = "ExampleProto";
enum Gender {
  MALE = 0;
  FEMALE = 1;
}
message ExampleMessage {
  int32 age = 1;
  string name = 2;
  repeated Hobby hobbies = 3;
  Gender gender = 4;
}

在Java代码中,我们可以如下设置Gender:

//Demo.java
builder.setGender(ExampleProto.Gender.MALE);

3、Map类型

PB中支持Map类型字段,可以更方便地处理键-值对。在定义Map字段时,需要指定键类型和值类型。

//example.proto
syntax = "proto3";
package com.example.demo;
option java_package = "com.example.demo.proto";
option java_outer_classname = "ExampleProto";
message ExampleMessage {
  int32 age = 1;
  string name = 2;
  map<string, string> properties = 3;
}

在Java代码中,我们可以如下设置properties:

//Demo.java
builder.putProperties("key1", "value1");

四、总结

本文详细介绍了PB在Java开发中的使用方法,包括安装和配置、消息定义、序列化和反序列化等方面。在实际开发中,PB可以帮助我们管理数据,提高传输效率,增强程序可读性和可维护性。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/153779.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-15 03:23
下一篇 2024-11-15 03:23

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论