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

    文章

    6514

    浏览量

    87609
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33151
  • ROS
    ROS
    +关注

    关注

    1

    文章

    272

    浏览量

    16686
收藏 人收藏

    评论

    相关推荐

    实现序列化和反序列化为什么要实现Serializable接口

    做服务化,需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值。
    的头像 发表于 07-12 11:05 963次阅读
    实现<b class='flag-5'>序列化</b>和反<b class='flag-5'>序列化</b>为什么要实现Serializable接口

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

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

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

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

    怎么利用反射实现json序列化和反序列化

    如果我要问你,你学习Go语言中遇到的最大难点在哪里? 我相信很多人都支支吾吾,说不出个所以然来,觉得每个都是难点,只有少部分人朋友能准确无误的令自己十分困扰的难点。 而我猜,70%的难点都是「反射」。 反射是Go语言中一个比较高级的话题,也是最容易让人感到迷惑的难题。反射的概念十分的抽象,经典的「反射三定律」也并不是那么好理解,甚至很多朋友在理解反射上已经有了很大的偏差,那么今天我们就给大家好好的讲一讲反射那些事
    的头像 发表于 11-09 11:06 1567次阅读
    怎么利用反射实现json<b class='flag-5'>序列化</b>和反<b class='flag-5'>序列化</b>

    S7-1200:Deserialize(反序列化)、Serialize(序列化

    S7-1200将Byte数组(即Byte流)看做是序列,也就是标准数组。与之相反,其他所有格式都是非序列的,通常程序使用的都是非序列的,例如Struct,UDT,或其他格式。
    的头像 发表于 04-19 11:23 2944次阅读

    S7-1200:Deserialize(反序列化)、Serialize(序列化

    V1版本中标准Byte数组不能是优化数据块的数组,可以是诸如P#M100.0 Byte 10这种看做是数组的(原因)。所以Deserialize的SRC_ARRAY与Serialize的DEST_ARRAY支持的Variant类型其实指向的就是P#指针这种,指向其他类型都不可以。
    的头像 发表于 04-27 16:16 2789次阅读

    NVIDIA TensorRT和DLA分析

      位于 GitHub 存储库中的sampleMNIST演示了如何导入经过训练的模型、构建 TensorRT 引擎、序列化和反序列化引擎,最后使用引擎执行推理。
    的头像 发表于 05-18 10:06 2609次阅读

    JsonReflect跨平台JSON序列化与反序列化

    ./oschina_soft/gitee-jsonreflect.zip
    发表于 06-21 11:52 1次下载
    JsonReflect跨平台JSON<b class='flag-5'>序列化</b>与反<b class='flag-5'>序列化</b>库

    YUDBModel对象序列化、反序列化、一键增删改查插件

    ./oschina_soft/YUDBModel.zip
    发表于 06-28 11:53 0次下载
    YUDBModel对象<b class='flag-5'>序列化</b>、反<b class='flag-5'>序列化</b>、一键增删改查插件

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

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

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

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

    JVM源码分析之不保证顺序的Class.getMethods

    如果大家看过或者实现过序列化序列化的代码,这个问题就不难回答了,今天碰到的这个问题其实是发生在大家可能最常用的`fastjson`库里的,所以如果大家在使用这个库,请务必检查下你的代码,以免踩到此坑
    的头像 发表于 06-27 15:22 353次阅读

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

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

    Spring Boot时配置JSON序列化选项的几种方法

    在Spring Boot Web 项目中,当使用JSON格式接收数据和返回数据的时候,Spring Boot 默认使用一个ObjectMapper实例来序列化响应和反序列化请求。 在本文中,我们
    的头像 发表于 10-09 10:26 1253次阅读

    浅析闭源系统下的Evilparcel漏洞

    Evilparcel漏洞可以导致Bundle在多次序列化和反序列化过程中内容发生改变。结合LAW跳板,可以实现权限提升,严重影响系统安全
    发表于 11-16 14:43 159次阅读
    浅析闭源系统下的Evilparcel漏洞