Java protobuf序列化

news2024/9/21 14:39:22

Protobuf概述

Protobuf(全称:Protocol Buffers)是由 Google 开发的一种语言中立、平台无关、可扩展的序列化协议。它用于高效地结构化数据的序列化和反序列化。Protobuf 的主要特点是其紧凑、高效和可扩展的编码格式,使其在各种网络通信和数据存储场景中广泛使用。

Protobuf 的基本概念

  • .proto 文件:用于定义数据结构的文件,扩展名为 .proto。它描述了消息的结构、字段类型和其他相关信息。
  • 消息(Message):在 .proto 文件中定义的数据结构。每个消息包含一个或多个字段,每个字段都有一个唯一的编号。
  • 字段(Field):消息中的数据项,每个字段都有一个类型和编号。
  • 编译器(protoc):将 .proto 文件编译成目标编程语言的代码生成器工具。

windows安装protobuf

下载protobuf (根据自己选择合适的版本)
在这里插入图片描述

下载后解压,配置Path环境变量到bin级目录
在这里插入图片描述
验证,打开cmd,输入protoc --version
在这里插入图片描述

引入maven依赖

在项目中引入protobuf包,和安装版本尽量保持一致

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

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

idea安装 Protobuf 插件

在这里插入图片描述

创建proto文件

在对应目录创建ExampleProto.proto文件

syntax = "proto3";

option java_package = "com.lf.java.netty.serialize.protobuf";
option java_outer_classname = "ExampleProto";
//是否需要將生成的类拆分为多个
option java_multiple_files = true;

message ExampleMessage {
    int32 id = 1;
    string content = 2;
}

  • syntax = “proto3” 表示协议版本,
  • option java_package = “com.lf.java.netty.serialize.protobuf” 表示生成的类所处的层级(可能需要手动调整文件,不然会报包名错误)
  • option java_multiple_files = true 表示需要將生成的类拆分为多个(false 的话就是不需要)

protoc编译文件

在文件位置打开cmd执行如下命令

protoc --java_out=./ ./example.proto

查看生成的文件在这里插入图片描述

测试生成的类

package com.lf.java.netty.serialize.protobuf;

import com.google.protobuf.CodedOutputStream;
import java.nio.ByteBuffer;

public class ExampleMessageMain {
    public static void main(String[] args) throws Exception {
        // 创建 ExampleMessage 实例
        ExampleMessage message = ExampleMessage.newBuilder()
                .setId(123)
                .setContent("Hello, Protocol Buffers!")
                .build();

        // 分配一个足够大的 ByteBuffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(message.getSerializedSize());

        // 创建 CodedOutputStream 并将消息写入 ByteBuffer
        CodedOutputStream outputStream = CodedOutputStream.newInstance(byteBuffer);
        message.writeTo(outputStream);

        // 刷新输出流以确保所有数据已写入
        outputStream.flush();

        // 准备 ByteBuffer 进行读取
        byteBuffer.flip();

        // 打印序列化后的字节数组
        byte[] byteArray = new byte[byteBuffer.remaining()];
        byteBuffer.get(byteArray);
        System.out.println("Serialized data: " + java.util.Arrays.toString(byteArray));

        // 反序列化 ExampleMessage 实例
        ExampleMessage deserializedMessage = ExampleMessage.parseFrom(byteArray);
        System.out.println("Deserialized message: " + deserializedMessage);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx中文URL请求404

这两天正在搞我的静态网站。方案是&#xff1a;从思源笔记Markdown笔记&#xff0c;用MkOcs build成静态网站&#xff0c;上传到到Nginx服务器。遇到一个问题&#xff1a;URL含有中文会404&#xff0c;全英文URL则正常访问。 ‍ 比如&#xff1a; ​​ ‍ 设置了utf-8 ht…

mac安装配置cmake

本机是2015 macbook pro mid&#xff0c;已经有点老了&#xff0c;用homebrew下cmake老出问题 其实cmake官网安装也不麻烦 一、官网下载对应安装包 Download CMake 和所有dmg文件一样安装 二、改成命令行使用 一般来说 tutorial 给的都是命令行build 命令行的设置如下&am…

React Hooks学习笔记

一、usestate的使用方法-初始化state函数 import React, { useState } from "react"; function App() {const [count, setCount] useState(0);return (<div><p>点击{count}次</p><button onClick{() > setCount(count 1)}>点击</bu…

【TAROT学习日记】韦特体系塔罗牌学习(1)——愚者 THE FOOL 0

韦特体系塔罗牌学习&#xff08;1&#xff09;——愚者 THE FOOL 0 https://www.tarotchina.net/major-arcana0-vip/ 目录 韦特体系塔罗牌学习&#xff08;1&#xff09;——愚者 THE FOOL 0牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际关…

原生小程序生成二维码并保存到本地

需求&#xff1a;我要在一个页面中生成一个二维码&#xff0c;并且这个二维码可以长按保存到本地或者发送给好友&#xff1b; 我这里是将生成的canvas二维码转换成图片&#xff0c;利用长按图片进行保存或转发 效果图&#xff1a; 第一步先下载对应的包&#xff1a; npm instal…

Web3知识图谱,一篇读完

这张图展示了区块链生态系统的架构和主要组件。以下是对图中内容的概括总结&#xff1a; 基础层&#xff1a; 底层基础设施&#xff1a;包括光纤网络、P2P网络、非对称加密、哈希算法、默克尔树和随机数生成。共识机制&#xff1a; PoW&#xff08;工作量证明&#xff09;: 比特…

C语言笔记31 •单链表经典算法OJ题-3.反转链表•

反转链表 1.问题 给你单链表的头节点 head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.代码实现&#xff1a; //3.反转链表 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int …

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名&#xff1a;admin 默认密码&#xff1a;Admin123 修改密码 然后他会提示你是否要修改密码&#xff0c;想改就改不想改就不改 进入命令行界面 进入系统视图开启web…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…

商业合作方案撰写指南:让你的提案脱颖而出的秘诀

作为一名策划人&#xff0c;撰写一份商业合作方案需要细致的规划和清晰的表达。 它是一个综合性的过程&#xff0c;需要策划人具备市场洞察力、分析能力和创意思维。 以下是能够帮助你撰写一份有效的商业合作方案的关键步骤和要点&#xff1a; 明确合作目标&#xff1a;设定…

网络协议(TCP三次握手,四次断开详解)

TCP的详细过程&#xff1a; TCP&#xff08;传输控制协议&#xff09;的三次握手和四次断开是其建立连接和终止连接的重要过程&#xff0c;以下是详细解释&#xff1a; 三次握手&#xff1a; 1. 第一次握手&#xff1a;客户端向服务器发送一个 SYN&#xff08;同步&#x…

深度探讨:无法恢复主文件表的困境与解救之道

在数据存储与管理的复杂世界中&#xff0c;主文件表&#xff08;Master File Table, MFT&#xff09;作为文件系统的核心组件&#xff0c;承载着至关重要的角色。一旦遭遇无法恢复主文件表的困境&#xff0c;用户将面临数据访问受限、文件丢失等严重后果。这通常是由于硬件故障…

火柴棒图python绘画

使用Python绘制二项分布的概率质量函数&#xff08;PMF&#xff09; 在这篇博客中&#xff0c;我们将探讨如何使用Python中的scipy库和matplotlib库来绘制二项分布的概率质量函数&#xff08;PMF&#xff09;。二项分布是统计学中常见的离散概率分布&#xff0c;描述了在固定次…

力扣 hot100 -- 动态规划(下)

目录 &#x1f4bb;最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 &#x1f3e0;乘积最大子数组 AC 动规 AC 用 0 分割 &#x1f42c;分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 &#x1f4bb;最长递增子序列 300. 最长递增子序列…

GPT-4o不香了, Claude3.5 Sonnet来了,直接免费可用

大家好&#xff01;我是YUAN。 刚刚&#xff01; AI领域又迎来了一场新的风暴——Anthropic公司发布了全新的Claude 3.5 Sonnet模型&#xff0c;这一消息如同一颗重磅炸弹&#xff0c;震撼了整个科技界。 Claude 3.5 Sonnet与GPT-4o对比 性能飞跃&#xff1a;超越GPT-4o Cl…

如何修改node_modules里的代码

为什么要改node_modules&#xff1f; 在平常的开发中&#xff0c;其实是很少需要改 node_modules 里的代码的。但是如果npm包有点小问题或者不符合我们的场景。 应该怎么改才能是最好的呢&#xff1f; 方法一&#xff1a;直接改 这种很好懂&#xff0c;就是直接进 node_modu…

SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis

前言 RedisTemplate 是 Spring Boot 访问 Redis 的核心组件&#xff0c;底层通过 RedisConnectionFactory 对多种 Redis 驱动进行集成&#xff0c;上层通过 XXXOperations 提供丰富的 API &#xff0c;并结合 Spring4 基于泛型的 bean 注入&#xff0c;极大的提供了便利&#x…

D-DPCC: Deep Dynamic Point Cloud Compression via 3D Motion Prediction

1. 论文基本信息 发布于&#xff1a; 2022 2. 创新点 首先提出了一种端到端深度动态点云压缩框架(D-DPCC)&#xff0c;用于运动估计、运动补偿、运动压缩和残差压缩的联合优化。提出了一种新的多尺度运动融合(MMF)模块用于点云帧间预测&#xff0c;该模块提取和融合不同运动流…

网络安全----防御----防火墙安全策略组网

防火墙组网 要求&#xff1a; 1&#xff0c;DMz区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff0c;办公区设备10.0.…

3d模型选不中任何东西是什么原因?---模大狮模型网

在进行3D模型设计过程中&#xff0c;有时会遇到无法选择模型中的任何元素的问题。这种情况可能会影响设计师的工作效率和体验&#xff0c;因此了解问题的原因以及如何解决是至关重要的。本文将探讨在3D建模中遇到无法选中模型元素的原因及解决方法。 一、问题原因分析 无法选中…