百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

protobuf之序列化数据和反序列化数据基础知识

wptr33 2025-03-14 21:29 11 浏览

什么是 protobuf

Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。

Protocol Buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序

protobuf 就是一个序列化数据和反序列化数据的方法,类似的还有 XML、Json、Java 的 Serializable 等。
但protobuf的效率高于XML、Json,不过protobuf生成的是字节码,可读性相比之略差

生成代码指定

protoc demo.proto --java_out=./

--cpp_out :在目标目录DST_DIR中产生C++代码
--java_out :在目标目录DST_DIR中产生Java代码
--python_out :在目标目录 DST_DIR 中产生Python代码
--go_out :在目标目录 DST_DIR 中产生Go代码
--ruby_out:在目标目录 DST_DIR 中产生Ruby代码
--javanano_out:在目标目录DST_DIR中生成JavaNano
--objc_out:在目标目录DST_DIR中产生Object代码
--csharp_out:在目标目录DST_DIR中产生Object代码
 --php_out:在目标目录DST_DIR中产生Object代码

protobuf安装配置

protobuf编辑器安装

下载地址:
https://github.com/protocolbuffers/protobuf/releases

配置环境变量

打开cmd命令行,输入

protoc
protoc --version
# 生成protoc代码
protoc demo.proto --java_out=./

IDEA配置protobuf

1、File->Setting->Plugins

安装protobuf插件

重启之后我们可以在工具栏看到这两个选项
一个是配置全局的 protobuf
一个是生成所有的 protobuf 文件

2、配置protobufs :Configure->GenProtobuf

此处配置的是安装的protoc.exe

protoc path :我们下载的 protobuf 编辑器的位置,在 bin 目录下有一个 .exe 文件
quick gen : 对应的语言,这里选择伟大的 Java


简单-proto案例

1、引入pom依赖

        
        
            com.google.protobuf
            protobuf-java
            3.20.1
        
        
        
            com.google.protobuf
            protobuf-java-util
            3.20.1
        

2、编写 .proto 文件

新建一个 demo.proto

//使用 proto3 语法 ,未指定则使用proto2
syntax = "proto3";

//生成 proto 文件所在包路径
package com.qingfeng.proto;

//生成 proto 文件所在包路径
option java_package = "com.qingfeng.proto";

//生成 proto 文件名
option java_outer_classname="DemoProto";

message Demo{
  //自身属性
  int32 id = 1;
  string code = 2;
  string name = 3;
}

3、生成 proto 对象

选中我们新建的.proto 文件,右键,选择框中的选项就可以生成了,将生成之后的文件拷贝到java目录下面。

4、新建测试类

package com.qingfeng.test;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import com.qingfeng.proto.DemoProto;

import java.util.Arrays;

/**
 * @author Administrator
 * @version 1.0.0
 * @ProjectName com.qingfeng-client
 * @Description TODO
 * @createTime 2022年05月01日 18:10:00
 */
public class DemoTest {

    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);
            //转 json
            jsonObject = JsonFormat.printer().print(demo1);

        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

        System.out.println("Json格式化结果:\n" + jsonObject);
        System.out.println("Json格式化数据大小: " + jsonObject.getBytes().length);
    }

}

protobuf 与 Java 数据类型对应

1、字段规则

required : 字段只能也必须出现 1 次,多用于必填项,必须赋值的字符

required  int32 id = 1

optional : 字段可出现 0 次或多次,可有可无的字段,可以使用[default = xxx]配置默认值

optional string name = 1 [default = "张三"]

repeated : 字段可出现任意多次(包括 0),多用于 Java List 属性

//list String
repeated string strList = 5;
//list 对象
repeated Role roleList = 6;

2、字段类型

protobuf 类型

java 类型

double

double

float

float

int32

int

int64

long

bool

boolean

string

String

系统默认值
string默认为空字符串
bool默认为false
数值默认为0
enum默认为第一个元素

3、复杂类型

Java String、Integer List 在 protobuf 的定义

//创建一个 User 对象
message User{
	//list Int
	repeated int32 intList = 1;
	//list String
	repeated string strList = 5;
}

Java 对象 List 在 protobuf 的定义

//创建一个 User 对象
message User{
	//list 对象
	repeated Role roleList = 6;
}

Java String、Integer Map 在 protobuf 的定义

//创建一个 User 对象
message User{
	// 定义简单的 Map string
	map intMap = 7;
	// 定义复杂的 Map 对象
	map stringMap = 8;
}

Java 对象 Map 在 protobuf 的定义

//创建一个 User 对象
message User{
	// 定义复杂的 Map 对象
	map mapObject = 8;
}


// 定义 Map 的 value 对象
message MapVauleObject {
	string code = 1;
	string name = 2;
}

Java 实体类中嵌套实体 在 protobuf 的定义

//创建一个 User 对象
message User{
	// 对象
	NickName nickName = 4;
}

// 定义一个新的Name对象
message NickName {
	string nickName = 1;
}

相关推荐

每天一个AI姬,AMD核显用户有福了,AI绘画打破 NVIDIA 显卡垄断

使用StableDiffusion进行AI绘画,并不一定只能使用NVIDIA英伟达显卡,甚至,也不一定只能使用独立显卡。今天我们使用AMD6800H核显,并安装了StableDif...

NETworkManager:功能强大的网络管理与问题排除工具

关于NETworkManagerNETworkManager是一款功能强大的网络管理与问题排除工具,该工具完全开源,可以帮助广大研究人员轻松管理目标网络系统并排除网络疑难问题。该工具使用远程桌面、Po...

AMD也能深度学习+免费AI绘画:StableDiffusion+ROCm部署教程!

某国政客扇扇嘴皮子,CN玩硬件和深度学习的圈子里就掀起了一场风暴,这就是著名的嘴皮子效应(误)。没了高性能计算的A100H100倒也能理解,但是美利坚这波把RTX4090禁售了就让人无语了,所以不少做...

windows 下编译 python_rtmpstream

最近在研究数字人,看了大咖的项目(https://github.com/lipku/metahuman-stream),尝试编译此项目的依赖项目python_rtmpstream(https://gi...

如何使用 Python 操作 Git 代码?GitPython 入门介绍

花下猫语:今天,我在查阅如何用Python操作Gitlab的时候,看到这篇文章,觉得还不错,特分享给大家。文中还提到了其它几种操作Git的方法,后续有机会的话,再陆续分享之~~作者:匿蟒...

网上看了不少,终于把ZlmediaKit流媒体框架搭建起来啦

你都站在2023年代了,视频通话、视频直播、视频会议、视频监控就是风口浪尖上的猪师兄,只要你学那么一丁点,拿个高薪的工作不过分吧!我也是半瓶子晃荡的,所以路人呀,共学习,同进步!本篇开始,只讲在Lin...

MacDown:一款 macOS 的强大 Markdown 编辑器

大家好,很高兴又见面了,我是"...

ZLMediaKit安装配置和推拉流

一、ZLMediaKit库简介ZLMediaKit是一个基于...

大神赞过的:学习 WebAssembly 汇编语言程序设计

文/阿里淘系F(x)Team-旭伦随着前端页面变得越来越复杂,javascript的性能问题一再被诟病。而Javascript设计时就不是为了性能优化设计的,这使得浏览器上可以运行的本地语言一...

【Docker】部署WVP视频监控平台

回来Docker系列,今天将会跟大家分享一则关于开源WVP视频监控平台的搭建。先说结论吧,一开始按照网上说的一步一步搭建没有搭建成功,不知道是版本太旧还是我这边机器有问题,尝试了好几个不同方式的搭建都...

MongoDB+GridFS存储文件方案

GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文...

【开源】强大、创新且直观的 EDA套件

今天分享的LibrePCB是...

Ollama如何制作自己的大模型?

背景Llama3发布了,这次用了...

Ollama使用指南【超全版】

一、Ollama快速入门Ollama是一个用于在本地运行大型语言模型的工具,下面将介绍如何在不同操作系统上安装和使用Ollama。官网:https://ollama.comGithub:http...

基于区块链的价值共享互联网即时通讯应用平台源码免费分享

——————关注转发之后私信回复【源码】即可免费获取到本项目所有源码基于区块链的价值共享互联网即时通讯应用平台,是一个去中心化的任何人都可以使用的通讯网络,是一款基于区块链的价值共享互联网即时通讯AP...