跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

如何在 Java 中使用 protobuf-java 生成 proto 文件及序列化

Java 协议缓冲区(Protobuf)是 Google 发布的高性能结构化数据标准,适用于跨平台快速通讯。通过安装 protoc 编译器、定义.proto 消息格式、编译生成 Java 类,完成数据的序列化和反序列化操作。相比 XML 和 JSON,Protobuf 编解码效率更优,适合大规模互联网系统的数据交换及微服务 RPC 通信场景。

苹果系统发布于 2025/2/23更新于 2026/6/520 浏览
如何在 Java 中使用 protobuf-java 生成 proto 文件及序列化

Protobuf 简介

Protocol Buffer (Protobuf) 是 Google 于 2008 年发布的高性能、灵活的结构化数据标准。它主要用于方便地描述结构化的数据,可用于跨平台快速通讯,更适合用于大规模互联网系统的数据交换。相比 XML、JSON 等非结构化数据编码方式,Protobuf 的编解码效率要优于它们。Google 内部也在逐渐使用 Protobuf 来替代其内部的传输协议,如 gRPC。对于开发者来说,Protobuf 提供了一系列便利的工具,包括 protoc 编译器、预定义消息类型以及各种语言的库支持。

Protobuf 的安装配置

安装环境准备

如果你还没有安装过 protobuf 的相关工具或环境,那么首先需要准备好以下的软件环境:

  1. 下载安装包
  2. 安装 Java 环境(如果没有安装,请参考官方文档进行安装)
  3. 设置环境变量
  4. 安装 protobuf 运行环境

如果你的机器上已经有相关的软件环境,你可以跳过此步。

  1. 下载 protoc 编译器压缩包,本例采用 v3.9.1 版本
  2. 下载完成后解压,进入 bin 目录,执行 protoc.exe 命令查看是否正确安装。正常情况下应该会打印出类似如下信息:
protoc 3.9.1
Usage: protoc [OPTION]... FILES
Parse PROTO_FILES and generate output based on options given:
...
Please specify a command with --help for more information.

如果能够看到 Usage 的信息说明安装成功。 3. 设置系统环境变量,找到'计算机'–>'属性'–>'高级系统设置'–>'环境变量'菜单,在'用户变量'中点击'新建',然后输入 PROTOBUF_HOME,值为 protoc 所在目录。然后在'系统变量'中找到 PATH,点击编辑,在后面添加 %PROTOBUF_HOME%\bin。 4. 最后重新打开 CMD 或者其他终端窗口,验证是否生效。

protoc --version

正常情况下输出类似:

libprotoc 3.9.1

编写 Protobuf 文件

使用 Protobuf 消息格式主要涉及到两个方面:定义消息格式和使用消息格式。定义消息格式是在.proto 文件中声明消息类型,例如声明一个 Person 类型的消息格式,其中包含 name 字符串字段、id 整型字段和 email 字符串数组字段,可以按照如下方式定义。

syntax = "proto3"; //指定 protobuf 版本,语法最低版本为 proto3
package demo; //指定当前文件的命名空间,通常建议按功能模块划分不同的命名空间

message Person {
  string name = 1;
  int32 id = 2;
  repeated string email = 3;
}

注意:

  • syntax:该选项用于指定该.proto文件的语法版本,proto3即是最新版本,也是本文使用的语法版本;
  • package:该选项用于指定当前文件的命名空间,命名空间一般建议按功能模块划分不同的命名空间,避免不同项目间发生冲突。

通过 .proto 文件可以生成对应语言的代码,因此第一步需要确认自己正在使用的编程语言,本文使用 Java 作为演示语言。

使用 Protobuf 编译器编译生成 Java 类

使用 Protobuf 消息格式定义完毕后,就可以用 Protobuf 编译器生成对应的 Java 类了,生成 Java 类的过程实际是编译.proto文件生成一个.java文件,所以需要确保你已经安装了 Protoc 编译器。

编译命令如下:

$ protoc -I=<source directory of.proto files> --java_out=<output directory> <list of.proto file paths>

参数说明:

-I: 指定导入的.proto文件的查找路径,可以在多个路径中用冒号分割,但是推荐只设置一个路径,否则容易导致生成的文件名重复;

--java_out: 指定生成 Java 类的存放目录;

<list of.proto file paths>: 指定要编译的.proto文件列表,可以用星号*表示匹配所有.proto文件,也可以用相对或绝对路径指定单个文件。

例如:

$ protoc -I=. --java_out=../main/java person.proto

上面命令表示将person.proto文件编译成 Java 类并存放在../main/java文件夹下。编译完成后,可以查看当前目录下的生成文件,其中就包含刚才生成的Person类。

在 Java 中使用 Protobuf

生成的 Java 类非常类似于原始的.proto文件中的消息定义,并且提供了相应的方法来序列化和反序列化消息数据。比如说,可以通过如下代码构造一个Person对象,并对其序列化:

import com.google.protobuf.*;

public class Main {
  public static void main(String[] args) throws Exception {
    Person person = Person.newBuilder()
     .setName("Alice")
     .setId(123)
     .addEmail("<EMAIL>")
     .addEmail("<EMAIL>")
     .build();

    byte[] data = person.toByteArray();
    
    FileOutputStream fos = new FileOutputStream("test.dat");
    fos.write(data);
    fos.close();
  }
}

上面代码构造了一个新的Person对象,并设置了三个字段的值,然后调用toByteArray()方法将其序列化为字节数组。接着保存到本地文件test.dat。

读取已有的字节序列,恢复到Person对象,可以使用如下代码:

FileInputStream fis = new FileInputStream("test.dat");
byte[] data = new byte[fis.available()];
fis.read(data);
fis.close();

Person person = Person.parseFrom(data);

System.out.println("Name: " + person.getName());
System.out.println("ID: " + person.getId());
System.out.println("Emails:");
for (String email : person.getEmailList()) {
  System.out.println("- " + email);
}

上面代码读取字节序列data,恢复成Person对象,然后打印各字段的值。parseFrom()方法是从字节序列解析出Person对象。

总结

本文介绍了如何在 Java 中使用 Protobuf 编译器来生成.proto文件,并通过 Java API 对消息进行序列化和反序列化。Protobuf 是一个强大的序列化协议,建议使用它的原因很多,包括跨平台性、高性能、简单易用等,大家可以根据自己的需求选择不同的方案。

目录

  1. Protobuf 简介
  2. Protobuf 的安装配置
  3. 安装环境准备
  4. 编写 Protobuf 文件
  5. 使用 Protobuf 编译器编译生成 Java 类
  6. 在 Java 中使用 Protobuf
  7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Spring 配置文件加载路径:classpath、file、URL 与 Web 容器
  • 近端策略优化算法 PPO 详解与代码实现
  • 网络安全重点就业岗位汇总与职业发展指南
  • Rokid 灵珠平台搭建旅游 AR 智能体实战指南
  • faster-whisper 异步批处理架构解析:性能优化与高并发
  • 精易模块 Excel 操作实战:构建中小学生成绩管理系统
  • 多源 BFS 算法详解与经典题目解析
  • Java 并发编程:Volatile 关键字底层原理与最佳实践
  • AI 辅助 FPGA 开发实践:Vivado 配置与智能编程
  • 行星减速器原理、计算与 C++ 实现
  • 基于子集选择算法的负载均衡方案
  • VS Code + WSL 下 GitHub 访问不稳定及 Copilot 卡顿解决方案
  • Whisper v0.2 语音转文字工具安装与使用指南
  • 现代C++异步编程与序列化:yalantinglibs 库解析
  • Go Channel 深入解析:状态、底层原理与工程实践
  • 开源 AI 去字幕工具 VSR 深度解析:架构、算法与实战
  • Qt 前后端通信:QWebChannel Js 与 C++ 互操作原理及示例
  • SpringBoot 集成 Shiro 与 Redis 实现 Session 共享
  • 滑动窗口算法:数组模拟哈希表实现无重复字符最长子串
  • ENSP 与 LLaMA-Factory 联动构建网络运维 AI 助手

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online