0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是序列化 为什么要序列化

麦辣鸡腿堡 来源:古月居 作者:古月居 2023-09-14 17:22 次阅读

什么是序列化?

“序列化”(Serialization )的意思是将一个对象转化为字节流。

这里说的对象可以理解为“面向对象”里的那个对象,具体的就是存储在内存中的对象数据。

与之相反的过程是“反序列化”(Deserialization )。

虽然挂着机器人的羊头,但是后面的介绍全部是计算机知识,跟机器人一丁点关系都没有,序列化就是一个纯粹的计算机概念。

序列化的英文Serialize就有把一个东西变成一串连续的东西之意。

形象的描述,数据对象是一团面,序列化就是将面团拉成一根面条,反序列化就将面条捏回面团。

另一个形象的类比是我们在对话或者打电话时,一个人的思想转换成一维的语音,然后在另一个人的头脑里重新变成结构化的思想,这也是一种序列化。

图片

面对序列化,很多人心中可能会有很多疑问。

首先,为什么要序列化?或者更具体的说,既然对象的信息本来就是以字节的形式储存在内存中,那为什么要多此一举把一些字节数据转换成另一种形式的、一维的、连续的字节数据呢?

如果我们的程序在内存中存储了一个数字,比如25。那要怎么传递25这个数字给别的程序节点或者把这个数字永久存储起来呢?

很简单,直接传递25这个数字(的字节表示,即0X19,当然最终会变成二进制表示11001以高低电平传输存储)或者直接把这个数字(的字节表示)写进硬盘里即可。

所以,对于本来就是连续的、一维的、一连串的数据(例如字符串),序列化并不需要做太多东西,其本质是就是由内存向其它地方拷贝数据而已。

所以,如果你在一个序列化库里看到memcpy函数不用觉得奇怪,因为你知道序列化最底层不过就是在操作内存数据而已(还有些库使用了流的ostream.rdbuf()-》sputn函数)。

可是实际程序操作的对象很少是这么简单的形式,大多数时候我们面对的是包含不同数据类型(int、double、string)的复杂数据结构(比如vector、list),它们很可能在内存中是不连续存储的而是分散在各处。比如ROS的很多消息都包含向量。

数据中还有各种指针和引用。而且,如果数据要在运行于不同架构的计算机之上的、由不同编程语言所编写的节点程序之间传递,那问题就更复杂了,它们的字节顺序endianness规定有可能不一样,基本数据类型(比如int)的长度也不一样(有的int是4个字节、有的是8个字节)。

这些都不是通过简单地、原封不动地复制粘贴原始数据就能解决的。这时候就需要序列化和反序列化了。

所以在程序之间需要通信时(ROS恰好就是这种情况),或者希望保存程序的中间运算结果时,序列化就登场了。

另外,在某种程度上,序列化还起到统一标准的作用。

我们把被序列化的东西叫object(对象),它可以是任意的数据结构或者对象:结构体、数组、类的实例等等。

把序列化后得到的东西叫archive,它既可以是人类可读的文本形式,也可以是二进制形式。

前者比如JSON和XML,这两个是网络应用里最常用的序列化格式,通过记事本就能打开阅读;

后者就是原始的二进制文件,比如后缀名是bin的文件,人类是没办法直接阅读一堆的0101或者0XC9D23E72的。

序列化算是一个比较常用的功能,所以大多数编程语言(比如C++PythonJava等)都会附带用于序列化的库,不需要你再去造轮子。

以C++为例,虽然标准STL库没有提供序列化功能,但是第三方库Boost提供了[ 2
]谷歌的protobuf也是一个序列化库,还有Fast-CDR,以及不太知名的Cereal,Java自带序列化函数,python可以使用第三方的pickle模块实现。

总之,序列化没有什么神秘的,用户可以看看这些开源的序列化库代码,或者自己写个小程序试试简单数据的序列化,例如这个例子,或者这个,有助于更好地理解ROS中的实现。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6867

    浏览量

    88800
  • 编程语言
    +关注

    关注

    10

    文章

    1937

    浏览量

    34587
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16963
收藏 人收藏

    评论

    相关推荐

    如何使用Serde进行序列化和反序列化

    Serde 是一个用于序列化和反序列化 Rust 数据结构的库。它支持 JSON、BSON、YAML 等多种格式,并且可以自定义序列化和反序列化方式。Serde 的特点是代码简洁、易于
    的头像 发表于 09-30 17:09 1246次阅读

    Java序列化的机制和原理

    本文讲解了Java序列化的机制和原理。从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法。AD:WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统
    发表于 07-10 07:27

    c语言序列化和反序列化有何区别

    这里写自定义目录标题c语言序列化和反序列化tplut.htplut.c测试代码参考c语言序列化和反序列化网络调用,数据传输都需要把数据序列化
    发表于 07-14 07:32

    关于c语言序列化和反序列化的知识点看完你就懂了

    关于c语言序列和反序列化的知识点你就懂了
    发表于 10-15 08:47

    SpringMVC JSON框架的自定义序列化与反序列化

    ?StringCodec是fastJson默认的String类型的反序列化逻辑类,里面处理的类型有String、StringBuffer、StringBuilder等,还有各种的集合、数组结构,涉及
    发表于 10-10 16:02

    序列化的网络流量分类算法

    针对传统基于端口和有效负载的网络流量分类算法识别率低分类算法复杂等问题,在分析了网络流量性质的基础上提出流序列化方法。它将网络流分解成多个流原子#通过提取序列化网络
    发表于 05-16 17:29 23次下载
    流<b class='flag-5'>序列化</b>的网络流量分类算法

    理解PHP反序列化漏洞

    理解PHP反序列化漏洞
    发表于 09-07 11:03 7次下载
    理解PHP反<b class='flag-5'>序列化</b>漏洞

    java序列化和反序列化范例和JDK类库中的序列化API

    一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反
    发表于 09-27 10:13 6次下载

    static属性为什么不会被序列化

    实现序列化和反序列化为什么实现Serializable接口?
    的头像 发表于 07-15 11:03 1729次阅读

    C#实现对象序列化的三种方式是什么

    很多小伙伴一提到序列化,都会想到二进制序列化,但其实序列化并不仅仅只是二进制序列化,我们常说的对象序列化有三种方式,分别是二进制
    的头像 发表于 02-22 16:11 1152次阅读
    C#实现对象<b class='flag-5'>序列化</b>的三种方式是什么

    python序列化对象

    序列化对象:将对象转换为可以存储或传输的形式。 (1) 用于存储:将对象的字节序列存储到文件中,程序退出后不会消失,便于后续使用。
    的头像 发表于 03-10 09:57 2314次阅读

    ROS中的序列化实现

    理解了序列化,再回到ROS。我们发现,ROS没有采用第三方的序列化工具,而是选择自己实现,代码在roscpp_core项目下的roscpp_serialization中,见下图。这个功能涉及的代码量
    的头像 发表于 09-14 17:26 880次阅读

    如何用C语言进行json的序列化和反序列化

    json是目前最为流行的文本数据传输格式,特别是在网络通信上广泛应用,随着物联网的兴起,在嵌入式设备上,也需要开始使用json进行数据传输,那么,如何快速简洁地用C语言进行json的序列化和反序列化
    的头像 发表于 10-07 11:05 1405次阅读

    Java序列化怎么使用

    转换方式就叫做序列化。将文件或者网络传输中得到的 byte[] 数组转换为 java 对象就叫做反序列化。 怎么使用 如果一个 Java 对象要能被序列化,必须实现一个特殊
    的头像 发表于 10-10 14:19 419次阅读

    什么时候需要Boost序列化

    程序开发中,序列化是经常需要用到的。像一些相对高级语言,比如JAVA, C#都已经很好的支持了序列化,那么C++呢?当然一个比较好的选择就是用Boost,这个号称C++准标准库的东西。 什么时候需要
    的头像 发表于 11-10 10:14 402次阅读