protobuf —— 认识和安装

protobuf —— 认识和安装

  • 什么是序列化和反序列化
  • 有哪些常见的什么是序列化和反序列化工具
  • Protobuf安装
    • 安装依赖
    • 开始安装
  • 连接动态库
  • 一些遗留问题

我们今天来看一个序列化和反序列化的工具:protobuf

什么是序列化和反序列化

序列化(Serialization)和反序列化(Deserialization)是计算机科学中用于处理对象状态转换的重要概念,主要涉及数据的存储和传输。

序列化(Serialization) 是将数据结构或对象的状态信息转换成可以存储或传输的格式的过程。这个过程通常涉及将复杂的对象转换成一个格式化后的字节流,该字节流可以被写入文件、通过网络发送或存储在数据库中。序列化的目的之一是为了在需要时能够将对象的状态完全恢复,即使是在不同的时间或不同的环境中。序列化不包括对象的方法,只是其数据成员(属性)。

例如,当你需要在网络上传输一个对象时,必须将其转换成可以穿越网络的数据格式(如JSON、XML或二进制流),这就是序列化过程。

反序列化(Deserialization) 则是序列化的逆过程,即将之前序列化得到的字节流或数据格式重新转换回原来的对象或数据结构。在接收端,通过反序列化,可以从接收到的数据中重新构建出与原来完全相同的对象实例,这样就可以在接收方继续使用这个对象了。

例如,当一个序列化的对象数据通过网络到达另一台计算机时,这台计算机上的程序会通过反序列化过程读取数据并重新构建出原始对象,使得程序能够处理这个对象就像它最初在发送端一样。

序列化和反序列化广泛应用于多种场景,包括但不限于:

  • 网络通信(如RPC、Web服务)
  • 数据持久化(保存对象到文件或数据库)
  • 分布式系统间的数据交换
  • 对象的深拷贝或持久化存储
  • 异步编程和进程间通信

举个不太恰当的例子:

想象你正在经营一家蛋糕店,每天需要制作各种美味的蛋糕并送到客户手中。在这个场景中,蛋糕可以类比为程序中的复杂对象,它包含了多层蛋糕体、奶油、水果等各种组成部分,就像是对象的多个属性和方法。
序列化就像是将蛋糕打包发货的过程:

  • 假设你接到一个远距离的订单,需要将一个定制的五层水果蛋糕送到客户那里。由于蛋糕不能直接邮寄,你得把它拆解成可以安全运输的部分。你把每一层蛋糕单独包装,奶油和水果也分开装好,并附上一份详细的组装说明书(这说明书可以类比为序列化时的格式规范,比如JSON或XML)。这个过程就相当于序列化,把蛋糕(对象)的状态转换成可以传输(存储)的形式。
    反序列化则是客户收到蛋糕后的组装过程:
  • 当蛋糕送达客户手中,他们根据说明书将蛋糕体、奶油和水果一一组合起来,最终还原成你店里展示的那种精美蛋糕。这个根据说明书重新构建蛋糕的过程,就相当于反序列化,即从传输格式(字节流或特定格式的数据)中恢复出原本的蛋糕(对象)。

通过这个例子,序列化就像是将蛋糕这种复杂的对象拆分成易于传输的组件并附上组装指南,而反序列化则是按照指南将这些组件重新组合成完整的蛋糕,保证在不同地点(比如厨房到客户家中)都能享受到同样的产品体验。

有哪些常见的什么是序列化和反序列化工具

序列化和反序列化是编程中常见的需求,尤其在处理数据存储、网络通信和分布式系统中。下面是一些常见的序列化和反序列化工具,它们各有特点,适用于不同的应用场景:

  1. JSON (JavaScript Object Notation):

    • 工具/库:Jackson, Gson, Moshi, Fastjson等。
    • 特点:人可读性强,易于理解,跨语言支持广泛,适合于Web服务和轻量级数据交换。
  2. XML (eXtensible Markup Language):

    • 工具/库:JAXB, DOM, SAX, StAX等。
    • 特点:结构化、自描述性强,标准成熟,但相比JSON更冗长,处理效率较低。
  3. Protocol Buffers (protobuf):

    • 工具/库:Google的protobuf库。
    • 特点:高效、紧凑的二进制格式,支持跨语言,需先定义.proto文件,适用于高性能、高负载的场景。
  4. Apache Avro:

    • 特点:提供了一套数据序列化的格式,支持动态模式,具有良好的跨语言兼容性,常用于Hadoop生态系统中。
  5. MessagePack:

    • 特点:高效的二进制格式,类似于JSON但更紧凑,支持多种语言,适用于对性能要求较高的场景。
  6. Thrift:

    • 工具/库:Apache Thrift。
    • 特点:跨语言的服务开发框架,包括序列化协议,支持多种数据类型和传输协议,适合构建分布式服务。
  7. YAML (YAML Ain't Markup Language):

    • 工具/库:SnakeYAML等。
    • 特点:易于阅读的结构化数据格式,常用于配置文件,虽然不如JSON普及但在某些领域(如Kubernetes配置)非常流行。
  8. Chronicle Wire:

    • 特点:高性能序列化框架,特别针对Java,简化了结构并采用树状结构提高性能,适用于金融、交易等高性能需求。
  9. Kryo:

    • 特点:Java库,提供了快速且高效的对象图形序列化,适用于Java对象的序列化,尤其是游戏开发和高性能计算。
  10. CBOR (Concise Binary Object Representation):

    • 特点:类似于JSON但更紧凑的二进制格式,适用于资源受限的环境或需要高效数据交换的场景。

选择哪种序列化工具取决于具体需求,如性能要求、数据交换的双方是否需要跨语言支持、是否需要高度压缩等。每种工具都有其优势和局限性,合理选择可以极大提升系统的效率和可维护性。

Protobuf安装

这里讲一下Protobuf在Linux下的安装:

首先,获取源码(git拉或者windows上下好了传给Linux也行):

这里给出github的网址:

https://github.com/protocolbuffers/protobuf/releases?page=5

找到这个版本:
在这里插入图片描述
传到Linux上,解压:
在这里插入图片描述

安装依赖

安装之前,先安装我们需要的依赖关系:

Ubuntu 用户选择

sudo apt-get install autoconf automake libtool curl make g++ unzip -y

CentOS 用户选择

sudo yum install autoconf automake libtool curl make gcc-c++ unzip

如果是Centos Stream的,可以把yum换成dnf:
在这里插入图片描述

开始安装

第一步执行这条:

# 第⼀步执⾏autogen.sh,但如果下载的是具体的某⼀⻔语⾔,不需要执⾏这⼀步。
./autogen.sh

第二步执行:

#  第⼆步执⾏configure,有两种执⾏⽅式,任选其⼀即可,如下:1、protobuf默认安装在 /usr/local ⽬录,
./configure# 2、修改安装⽬录,统⼀安装在/usr/local/protobuf下
./configure --prefix=/usr/local/protobuf

第三步执行这三句:

make // 执⾏15分钟左右
make check // 执⾏15分钟左右
sudo make install

有些同学可能会在 make check 出现错误,例如:
在这里插入图片描述出现以上错误的原因是test的模块⾥⾯有⾮常多的测试⽤例,这些⽤例对服务器环境要求特别严格,需
要增⼤下swap分区,具体操作可参考:

https://blog.csdn.net/AlexWang30/article/details/90341172

(建议可以先扩大3G,再执行 make check 。如果还是报错,再扩⼤到5G重新执行 make check )
执行 make check 后 ,出现以下内容就可以执行 sudo make install
在这里插入图片描述到此,需要你回忆⼀下在执行configure时,如果当时选择了第⼀种执行方式,也就是./configure ,那么到这就可以正常使⽤protobuf了。如果选择了第⼆种执行方式,即修改了安装
目录,那么还需要在/etc/profile 中添加⼀些内容:

sudo vim /etc/profile
# 添加内容如下:#(动态库搜索路径) 程序加载运⾏期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执⾏程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头⽂件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头⽂件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/

最后一步:

最后⼀步,重新执⾏ /etc/profile ⽂件:
source /etc/profile

在这里插入图片描述

连接动态库

此时安装好了,但可能还是不行,会报找不到动态库,
在这里插入图片描述

这个时候进入到:/etc/ld.so.conf.d/并创建一个protobuf.conf
在这里插入图片描述
写上这两句话:
在这里插入图片描述我们再查:
在这里插入图片描述
这时候有了,这时候就不会报错了,此时真正安装成功!

在这里插入图片描述在这里插入图片描述在这里插入图片描述

一些遗留问题

我在windows上也安装了protobuf,安装方法也比这种简单的多,但是,运行时老是报找不到port_def.inc
在这里插入图片描述
并且如果用cmake,nmake搭建,也会出现同样的问题,找不到port_def.inc文件,可能是我哪里有问题,肯望有大佬指点迷津!!
在这里插入图片描述

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

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

相关文章

【uni-best+UView】使用mitt实现自定义错误对话框

痛点 目前在设计一个uni-best的前端全局的异常提示信息,如果采用Toast方式,对微信支持的不友好。微信的7中文长度连个NPE信息都无法完整显示,更不用提Stacktrace的复杂报错了。如果使用对话框,必须在页面先预先定义,对…

链表类型的有界或无界阻塞线程安全队列-LinkedBlockingQueue(FIFO)和LinkedBlockingDeque

LinkedBlockingQueue和LinkedBlockingDeque基本上大部分特性是相同的。 注意:所有代码源码都是LinkedBlockingQueue的。 特点: 都继承于AbstractQueue并实现BlockingQueue,说明有Queue的一些特性例如FIFO和一些方法。两个都是链表结构且结构可变(动态数组),最大容量2^31…

时间(空间)复杂度(结构篇)

目录 前言: 一、时间复杂度 1.1 时间复杂度的定义 1.2 时间复杂度的分析 表示方法: 1.3 常见的时间复杂度 1.4 时间复杂度的计算以及简单的分析 冒泡排序 折半查找(二分查找) 斐波那契数列(递归&#xff09…

OSPF网络类型实验2

对R4 对R5,找R1注册 对R1宣告环回,再宣告一下tunnel接口 本实验不考虑区域划分 现在已经全部宣告完成 对R1,2,3改接口 broadcast工作方式hello时间10s,然后进行dr选举,由于2,3之间没有伪广播 …

ciscn2024(上传一下,有侵权什么的问题的话联系删除)

Web Simple_php 这个Simple_php一点儿也不Simple (⋟﹏⋞) 源码放这儿了&#xff1a; <?phpini_set(open_basedir, /var/www/html/); error_reporting(0);if(isset($_POST[cmd])){$cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag…

Yolov9调用COCOAPI生成APs,APm,APl

最近在做小目标检测的东西&#xff0c;因为后期毕业论文需要&#xff0c;所以开始使用Yolov9模型&#xff0c;运行val.py的时候不会自己产生小目标的AP指标&#xff0c;所以研究了一下&#xff0c;步骤非常简单&#xff1a; 第一步&#xff1a; 在数据集中生成json格式的Annota…

【Text2SQL 经典模型】HydraNet

论文&#xff1a;Hybrid Ranking Network for Text-to-SQL ⭐⭐⭐ arXiv:2008.04759 HydraNet 也是利用 PLM 来生成 question 和 table schema 的 representation 并用于生成 SQL&#xff0c;并在 SQLova 和 X-SQL 做了改进&#xff0c;提升了在 WikiSQL 上的表现。 一、Intro…

有趣的css - 加减动态多选框

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个适用树形菜单场景的加减动态多选框。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面…

【调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站】

调试笔记-系列文章目录 调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站 文章目录 调试笔记-系列文章目录调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站 前言一、调试环境…

数组的理论知识

文章目录 数组的理论知识 数组的理论知识 数组是我们在编程时期经常使用到的一种数据结构。 特点&#xff1a; 在连续的内存空间中存储相同数据类型的数据 如图&#xff1a; arr 数组 注意点&#xff1a;数组的修改的效率是比较慢的&#xff0c;O(n)&#xff0c;因为数组只…

人工智能万卡 GPU 集群的硬件和网络架构

万卡 GPU 集群互联&#xff1a;硬件配置和网络设计 一、背景 自从 OpenAI 推出 ChatGPT 以来&#xff0c;LLM 迅速成为焦点关注的对象&#xff0c;并取得快速发展。众多企业纷纷投入 LLM 预训练&#xff0c;希望跟上这一波浪潮。然而&#xff0c;要训练一个 100B 规模的 LLM&a…

嵌入式学习——3——多点通信

1、套接字选项&#xff08;socket options&#xff09; int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); 功能&#xff1a;获取或设置套接…

设计模式在芯片验证中的应用——单例

一、单例模式 单例模式(Singleton)是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。验证环境配置(configuration)类、超时(timeout)处理类等可以使用单例实现。比如说验证环境需要在特定场景中监测特定接口上的超时事…

STM32-GPIO八种输入输出模式

图片取自 江协科技 STM32入门教程-2023版 细致讲解 中文字幕 p5 【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p5&share_sourcecopy_web&vd_source327265f5c70f26411a53a9226af0b35c 目录 ​编辑 一.STM32的四种输…

达梦数据库创建根据日期按月自动分区表

达梦数据库创建根据日期自动分区表 概念 达梦数据交换平台(简称DMETL)是在总结了众多大数据项目经验和需求并结合最新大数据发展趋势和技术的基础上&#xff0c;自主研发的通用的大数据处理与集成平台。 DMETL创新地将传统的ETL工具&#xff08;Extract、Transform、Loading…

maven默认src下的xml,properties文件不打包到classes文件夹下

一、第一种是建立src/main/resources文件夹&#xff0c;将xml&#xff0c;properties等资源文件放置到这个目录中。maven工具默认在编译的时候&#xff0c;会将resources文件夹中的资源文件一块打包进classes目录中。 这时候注意把resources设置成resource目录&#xff0c;已经…

CI/CD 管道中的自动化测试:类型和阶段

在上一篇文章中&#xff0c;我们讨论了敏捷团队自动化测试用例的各种用例。其中一种情况是&#xff0c;团队希望将测试与每个构建集成&#xff0c;并将持续集成作为构建过程的一部分。 在本文中&#xff0c;我们将讨论持续集成/持续交付平台中的集成测试。 让我们先从基础知识…

Sentinel Dashboard 规则联动持久化方案

一、Sentinel Dashboard 规则联动持久化方案 Sentinel 是阿里开源的一个流量控制组件&#xff0c;它提供了一种流量控制、熔断降级、系统负载保护等功能的解决方案。并且我们通过 Sentinel Dashboard 可以非常便捷的添加或修改规则策略&#xff0c;但是如果细心的小伙伴应该可…

Jenkins、GitLab部署项目

1、安装JDK 1.1、下载openJdk11 yum -y install fontconfig java-11-openjdk1.2、查看安装的版本号 java -version1.3、配置环境变量 vim /etc/profile在最底部添加即可 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 export PATH$JAVA_HOME/…

经典链表题-链表回文结构

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…