protobuf —— 认识和安装
- 什么是序列化和反序列化
- 有哪些常见的什么是序列化和反序列化工具
- Protobuf安装
- 安装依赖
- 开始安装
- 连接动态库
- 一些遗留问题
我们今天来看一个序列化和反序列化的工具:protobuf。
什么是序列化和反序列化
序列化(Serialization)和反序列化(Deserialization)是计算机科学中用于处理对象状态转换的重要概念,主要涉及数据的存储和传输。
序列化(Serialization) 是将数据结构或对象的状态信息转换成可以存储或传输的格式的过程。这个过程通常涉及将复杂的对象转换成一个格式化后的字节流,该字节流可以被写入文件、通过网络发送或存储在数据库中。序列化的目的之一是为了在需要时能够将对象的状态完全恢复,即使是在不同的时间或不同的环境中。序列化不包括对象的方法,只是其数据成员(属性)。
例如,当你需要在网络上传输一个对象时,必须将其转换成可以穿越网络的数据格式(如JSON、XML或二进制流),这就是序列化过程。
反序列化(Deserialization) 则是序列化的逆过程,即将之前序列化得到的字节流或数据格式重新转换回原来的对象或数据结构。在接收端,通过反序列化,可以从接收到的数据中重新构建出与原来完全相同的对象实例,这样就可以在接收方继续使用这个对象了。
例如,当一个序列化的对象数据通过网络到达另一台计算机时,这台计算机上的程序会通过反序列化过程读取数据并重新构建出原始对象,使得程序能够处理这个对象就像它最初在发送端一样。
序列化和反序列化广泛应用于多种场景,包括但不限于:
- 网络通信(如RPC、Web服务)
- 数据持久化(保存对象到文件或数据库)
- 分布式系统间的数据交换
- 对象的深拷贝或持久化存储
- 异步编程和进程间通信
举个不太恰当的例子:
想象你正在经营一家蛋糕店,每天需要制作各种美味的蛋糕并送到客户手中。在这个场景中,蛋糕可以类比为程序中的复杂对象,它包含了多层蛋糕体、奶油、水果等各种组成部分,就像是对象的多个属性和方法。
序列化就像是将蛋糕打包发货的过程:
- 假设你接到一个远距离的订单,需要将一个定制的五层水果蛋糕送到客户那里。由于蛋糕不能直接邮寄,你得把它拆解成可以安全运输的部分。你把每一层蛋糕单独包装,奶油和水果也分开装好,并附上一份详细的组装说明书(这说明书可以类比为序列化时的格式规范,比如JSON或XML)。这个过程就相当于序列化,把蛋糕(对象)的状态转换成可以传输(存储)的形式。
反序列化则是客户收到蛋糕后的组装过程:- 当蛋糕送达客户手中,他们根据说明书将蛋糕体、奶油和水果一一组合起来,最终还原成你店里展示的那种精美蛋糕。这个根据说明书重新构建蛋糕的过程,就相当于反序列化,即从传输格式(字节流或特定格式的数据)中恢复出原本的蛋糕(对象)。
通过这个例子,序列化就像是将蛋糕这种复杂的对象拆分成易于传输的组件并附上组装指南,而反序列化则是按照指南将这些组件重新组合成完整的蛋糕,保证在不同地点(比如厨房到客户家中)都能享受到同样的产品体验。
有哪些常见的什么是序列化和反序列化工具
序列化和反序列化是编程中常见的需求,尤其在处理数据存储、网络通信和分布式系统中。下面是一些常见的序列化和反序列化工具,它们各有特点,适用于不同的应用场景:
-
JSON (JavaScript Object Notation)
:- 工具/库:Jackson, Gson, Moshi, Fastjson等。
- 特点:人可读性强,易于理解,跨语言支持广泛,适合于Web服务和轻量级数据交换。
-
XML (eXtensible Markup Language)
:- 工具/库:JAXB, DOM, SAX, StAX等。
- 特点:结构化、自描述性强,标准成熟,但相比JSON更冗长,处理效率较低。
-
Protocol Buffers (protobuf)
:- 工具/库:Google的protobuf库。
- 特点:高效、紧凑的二进制格式,支持跨语言,需先定义.proto文件,适用于高性能、高负载的场景。
-
Apache Avro
:- 特点:提供了一套数据序列化的格式,支持动态模式,具有良好的跨语言兼容性,常用于Hadoop生态系统中。
-
MessagePack
:- 特点:高效的二进制格式,类似于JSON但更紧凑,支持多种语言,适用于对性能要求较高的场景。
-
Thrift
:- 工具/库:Apache Thrift。
- 特点:跨语言的服务开发框架,包括序列化协议,支持多种数据类型和传输协议,适合构建分布式服务。
-
YAML (YAML Ain't Markup Language)
:- 工具/库:SnakeYAML等。
- 特点:易于阅读的结构化数据格式,常用于配置文件,虽然不如JSON普及但在某些领域(如Kubernetes配置)非常流行。
-
Chronicle Wire
:- 特点:高性能序列化框架,特别针对Java,简化了结构并采用树状结构提高性能,适用于金融、交易等高性能需求。
-
Kryo
:- 特点:Java库,提供了快速且高效的对象图形序列化,适用于Java对象的序列化,尤其是游戏开发和高性能计算。
-
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文件,可能是我哪里有问题,肯望有大佬指点迷津!!