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

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

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

什么是 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;
}

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...