Java中使用protobuf
一、简介
Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。
Protocol Buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序
与JSON相比
protobuf的效率高,不过protobuf生成的是字节码,可读性相比之略差
Protobuf不仅仅是一种消息格式,它还是一组用于定义和交换这些消息的规则和工具。 谷歌是这个协议的创造者,已开源,并为常用的编程语言提供生成代码的工具,
如JavaScript,Java,PHP,C#,Ruby,Objective C,Python,C ++和Go。 除此之外,Protobuf具有比JSON更多的数据类型,如枚举和方法,并且还大量用于RPC(远程过程调用)
参考资料
| 名称 | 地址 |
|---|---|
| protobuf 编译器 | Releases · protocolbuffers/protobuf · GitHub |
| Protobuf 语法指南 | [译]Protobuf 语法指南 |
二、protobuf 环境配置
1.下载编译器
选择自己需要的版本下载即可,我这里下载的是win64 3.15.3,下载之后进行解压
2.配置环境变量
path 系统变量中增加配置,也就是你的解压文件位置

3.检查是否配置成功
cmd 之后,输入
protoc |

查看版本
protoc --version |

这样我们就可以在命令行去生成 proto 文件了
二、idea 中使用 protobuf
1.idea 安装 protobuf 相关插件
任意安装以下插件即可,安装之后重启 idea
一个是根据 .proto 文件来生成 proto 对象
一个是使得 idea 支持我们的 proto 语法,例如关键词高亮等功能

2.写一个简单的 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 的语法高亮

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

生成后的 proto 文件如下

三、protobuf方法使用
1.序列化和反序列化
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);//转 jsonjsonObject = JsonFormat.printer().print(demo1);} catch (InvalidProtocolBufferException e) {e.printStackTrace();}System.out.println("Json格式化结果:\n" + jsonObject);System.out.println("Json格式化数据大小: " + jsonObject.getBytes().length);} |
2.protobuf 和 JSON 互相转换
引入依赖
com.google.protobufprotobuf-java-util3.7.1 |
代码实现
public class ProtoJsonUtils {public static String toJson(Message sourceMessage)throws IOException {String json = JsonFormat.printer().print(sourceMessage);return json;}public static Message toProtoBean(Message.Builder targetBuilder, String json) throws IOException {JsonFormat.parser().merge(json, targetBuilder);return targetBuilder.build();}
} |
对于一般的数据类型,如int,double,float,long,string都能够按照理想的方式进行转化。对于protobuf中的enum类型字段,会被按照enum的名称转化为string。对于bytes类型的字段,则会转化为utf8类型的字符串
3.protobuf 与 Java 对象互转
引入依赖
<!-- protocol buffer support --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>${protobuf.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-all</artifactId><version>${grpc.version}</version></dependency> |
代码实现
public class ProtobufBeanUtil {private ProtobufBeanUtil(){}/*** 将ProtoBean对象转化为POJO对象** @param destPojoClass 目标POJO对象的类类型* @param sourceMessage 含有数据的ProtoBean对象实例* @param <PojoType> 目标POJO对象的类类型范型* @return* @throws IOException*/public static <PojoType> PojoType toPojoBean(@NotNull Class<PojoType> destPojoClass, @NotNull Message sourceMessage)throws IOException {String json = JsonFormat.printer().print(sourceMessage);return new Gson().fromJson(json, destPojoClass);}/*** 将POJO对象转化为ProtoBean对象** @param destBuilder 目标Message对象的Builder类* @param sourcePojoBean 含有数据的POJO对象* @return* @throws IOException*/public static void toProtoBean(@NotNull Message.Builder destBuilder, @NotNull Object sourcePojoBean) throws IOException {String json = new Gson().toJson(sourcePojoBean);JsonFormat.parser().merge(json, destBuilder);} |
相关文章:
Java中使用protobuf
一、简介 Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。 Protocol Buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol B…...
2020款Macbook Pro A2251无法充电无法开机定位及修复
问题背景 up主有一台2020年的Macbook Pro,带Touch Bar,16G512G,四核I5,型号A2251 应该是一周没充电了,之前还用的好好的,后来有一天出差想带上 打开没电,手头上有个小米的66W快充头,…...
Spring Cloud --- 引入Gateway网关
引入Gateway网关 介绍 Spring Cloud Gateway 组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway 是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点 IP 端口信息,从…...
ESP32-C3实现定时器的启停(Arduino IDE)
1概述 ESP32-C3微控制器有多个定时器,这些定时器可用于各种用途,包括计时、生成PWM信号、测量输入信号的频率等。以下是ESP32-C3上可用的定时器资源: 两个硬件定时器: 定时器0:这是一个通用定时器,通常用于…...
centos升级g++使其支持c++17
centos升级g使其支持c17 升级g的原因现象原因 升级g方法更新镜像源yum升级g版本 总结 升级g的原因 现象 编译最新版本的jsoncpp报一下错误 jsontest.h:87:37: error: ‘hexfloat’ is not a member of ‘std’oss << std::setprecision(16) << std::hexfloat &l…...
Pytest日志收集器配置
前言 在pytest框架中,日志记录(logging)是一个强大的功能,它允许我们在测试期间记录信息、警告、错误等,从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成,因此你可以很容易地在…...
Morris算法(大数据作业)
我只能说,概率证明真的好难啊!(;′⌒) 这也证明我的概率论真的学的很差劲,有时间一定要补补/(ㄒoㄒ)/~~ 算法不难证明难! 当一个数足够大时,能不能用更少的空间来近似表示这个整数n,于是&…...
TCP/IP协议 【三次握手】过程简要描述
当建立TCP连接时,三次握手的作用简要描述如下: 第一次握手(客户端向服务器发送SYN包):客户端发送SYN包给服务器,确认服务器是否在线并等待响应。 第二次握手(服务器向客户端发送SYNACK包&…...
docker 数据管理,数据持久化详解 二 数据卷容器
数据卷和数据卷容器核心区别 持久性对比 数据卷:当您直接在启动容器时指定了一个数据卷(例如,使用docker run -v /data),这个数据卷会自动创建,并且其内容会在容器停止或删除后继续存在。您可以随时通过Do…...
Logrotate:Linux系统日志轮转和管理的实用指南
Logrotate是Linux系统中用于自动化管理日志文件的强大工具,它能够高效、安全地轮转、压缩和清理日志文件,从而有效控制日志文件大小,节省磁盘空间,并显著提升系统可维护性和安全性。本文档将提供Logrotate的实用指南,涵…...
八股面试3(自用)
基本数据类型和引用数据类型区别 java中数据类型分为基本数据类型和引用数据类型 8大基本数据类型 1.整数:int,long,short,byte 2.浮点类型:float,double 3.字符类型:char 4.布尔类型&…...
【微服务】springboot3 集成 Flink CDC 1.17 实现mysql数据同步
目录 一、前言 二、常用的数据同步解决方案 2.1 为什么需要数据同步 2.2 常用的数据同步方案 2.2.1 Debezium 2.2.2 DataX 2.2.3 Canal 2.2.4 Sqoop 2.2.5 Kettle 2.2.6 Flink CDC 三、Flink CDC介绍 3.1 Flink CDC 概述 3.1.1 Flink CDC 工作原理 3.2 Flink CDC…...
【Android】浅析OkHttp(1)
【Android】浅析OkHttp(1) OkHttp 是一个高效、轻量级的 HTTP 客户端库,主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求,还支持许多高级功能,如连接池、透明的 GZIP 压缩、响应缓存、WebSocke…...
Generate-on-Graph
目录 摘要1 引言2 相关工作4 不完整知识图谱问答(IKGQA)4.1 任务介绍4.2 数据集构建 5 Generate-on-Graph (GoG) 摘要 为了解决大型语言模型(LLMs)在知识不足和幻觉问题上的困扰,众多研究探索了将LLMs与知识图谱&…...
学习笔记——交换——STP(生成树)简介
一、技术背景 1、生成树技术背景 交换机单线路组网,存在单点故障(上左图),上行线路及设备都不具备冗余性,一旦链路或上行设备发生故障,业务将会中断。 为了使得网络更加健壮、更具有冗余性,将拓扑修改为(上右图)接入…...
【Linux从入门到精通一】操作系统概述与Linux初识
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
Git 深度解析 —— 从基础到进阶
目录 1. Git 基础概念 1.1 版本控制 (Version Control) 1.2 分布式版本控制 (Distributed Version Control) 1.3 核心概念 1.4 Git 工作流程 2. Git 常用命令 2.1 初始化仓库 2.2 添加文件 2.3 提交修改 2.4 查看状态 2.5 查看历史记录 2.6 切换分支 2.7 创建分支…...
PCIE-变量总结
1.changed_speed_recovery: 表示链路双方已经将链路速率协商为更高的速率。 在configuration.complete状态下此变量会reset成0; 当前状态在recovery.rcvrlock状态: 在经过24ms的timeout之后,任何一个已经configured的lane&…...
【iOS】AFNetworing初步学习
文章目录 前言OC的网络请求步骤单例封装网络请求使用AFNetworking进行网络请求 前言 在暑假,学习了一些简单的网络请求的内容,本周学习了AFNetworking的基本使用,通过本篇博客进行一个简单的介绍。 OC的网络请求步骤 简单的网络请求主要有…...
【数据结构】堆的创建
Heap.h #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<assert.h>//创建堆结构体 typedef int HPDateType; typedef struct Heap {HPDateType* a;int size;int capacity; }HP;//堆的初始化 void HPInit(HP* php);//堆的销毁 voi…...
2025 ICPC武汉邀请赛 G [根号分治 容斥原理+DP]
Problem - G - Codeforces 观察题目,我们可以用贡献法, 计算每个格子的贡献,然后累加起来,对于重复的部分我们要减去 1.路径数量 首先,计算两个位置间有多少种路径互通,我们可以利用组合数进行计算&#x…...
突破鸣潮帧率限制:WaveTools工具箱全攻略与优化指南
突破鸣潮帧率限制:WaveTools工具箱全攻略与优化指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 在《鸣潮》1.2版本更新后,许多玩家发现游戏帧率被锁定在60FPS,无法充…...
Vue3 使用 Store 的注意事项:官方推荐的方式始终是在 setup 或 composable 函数内部调用 useStore()
在 hook 中错误使用 Store:useStore() 在函数外部调用import { useUserList } from "/hooks"; import { useDepartmentStore } from "/stores"; import type { Department } from "/types"; import { onMounted, ref } from "vu…...
MATLAB语音识别 matlab语音识别,可以识别数字0-9,有gui界面,注释齐全,有报告
MATLAB语音识别 matlab语音识别,可以识别数字0-9,有gui界面,注释齐全,有报告。(本程序测试版本为Matlab 2019b,低于此版本的请安装新版,以免无法运行) 链接为电子资料,一…...
NVIDIA Profile Inspector完整指南:解锁显卡隐藏性能的终极免费工具
NVIDIA Profile Inspector完整指南:解锁显卡隐藏性能的终极免费工具 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为游戏卡顿、画面撕裂而烦恼吗?NVIDIA Profile Inspecto…...
IM023-将PDF文件导出jpg图片到PDF所在目录下
批量将pdf文档每页导出为jpg图片 比如A文件夹下有B、C、D、E....等文件夹,每个文件夹下都有一定的pdf文件,将程序放在A文件夹下,运行程序后会将B、C、D、E....等文件夹下每个pdf文件分别导出为jpg图片,导出的jpg图片命名方式为&am…...
别再忍受龟速下载!保姆级教程:Ubuntu 18.04一键更换阿里云/清华源(附SSH无桌面操作)
Ubuntu 18.04国内软件源极速配置指南:告别蜗牛速度的终极方案 每次执行apt update时盯着缓慢爬升的进度条,是否让你产生砸键盘的冲动?作为国内Ubuntu用户,默认国际源的龟速下载堪称开发效率的头号杀手。本文将彻底解决这个痛点——…...
Phi-4-mini-reasoning教育科技:智能错题本中归因分析与解法推荐引擎
Phi-4-mini-reasoning教育科技:智能错题本中归因分析与解法推荐引擎 1. 模型介绍与教育应用价值 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型,特别适合数学题、逻辑题等多步分析场景。在教育科技领域,它为解决传统错题本"…...
快速原型:用快马一键生成虚拟机监控程序功能诊断脚本
今天在调试一个虚拟机环境时,遇到了Hypervisor功能不可用的问题。这种问题在开发中很常见,但排查起来往往需要手动执行多个检查步骤,效率很低。于是我想,能不能写个脚本自动完成这些诊断工作呢? 问题背景与需求分析 虚…...
微信聊天记录永久保存终极指南:用WeChatMsg轻松掌控你的数字记忆
微信聊天记录永久保存终极指南:用WeChatMsg轻松掌控你的数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...
