色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    7006

    瀏覽量

    88955
  • 編程語言
    +關注

    關注

    10

    文章

    1942

    瀏覽量

    34711
  • ROS
    ROS
    +關注

    關注

    1

    文章

    278

    瀏覽量

    17004
收藏 人收藏

    評論

    相關推薦

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

    Serde 是一個用于序列化和反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點是代碼簡潔、易于
    的頭像 發表于 09-30 17:09 ?1283次閱讀

    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 ?1761次閱讀

    C#實現對象序列化的三種方式是什么

    很多小伙伴一提到序列化,都會想到二進制序列化,但其實序列化并不僅僅只是二進制序列化,我們常說的對象序列化有三種方式,分別是二進制
    的頭像 發表于 02-22 16:11 ?1200次閱讀
    C#實現對象<b class='flag-5'>序列化</b>的三種方式是什么

    python序列化對象

    序列化對象:將對象轉換為可以存儲或傳輸的形式。 (1) 用于存儲:將對象的字節序列存儲到文件中,程序退出后不會消失,便于后續使用。
    的頭像 發表于 03-10 09:57 ?2339次閱讀

    ROS中的序列化實現

    理解了序列化,再回到ROS。我們發現,ROS沒有采用第三方的序列化工具,而是選擇自己實現,代碼在roscpp_core項目下的roscpp_serialization中,見下圖。這個功能涉及的代碼量
    的頭像 發表于 09-14 17:26 ?909次閱讀

    如何用C語言進行json的序列化和反序列化

    json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化
    的頭像 發表于 10-07 11:05 ?1468次閱讀

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象要能被序列化,必須實現一個特殊
    的頭像 發表于 10-10 14:19 ?445次閱讀

    什么時候需要Boost序列化

    程序開發中,序列化是經常需要用到的。像一些相對高級語言,比如JAVA, C#都已經很好的支持了序列化,那么C++呢?當然一個比較好的選擇就是用Boost,這個號稱C++準標準庫的東西。 什么時候需要
    的頭像 發表于 11-10 10:14 ?420次閱讀
    主站蜘蛛池模板: YELLOW视频直播在线观看高清 | 九九热这里有精品| 花蝴蝶免费观看影视| 久久99亚洲AV无码四区碰碰| 六度影院最新| 欧美人成在线观看ccc36 | 毛片网站在线观看| 青青视频 在线 在线播放| 无码射肉在线播放视频| 亚洲中文无码AV在线观看| 97碰成视频免费| 国产成人久久精品AV| 久久99精品国产免费观看| 暖暖 免费 高清 日本在线| 色哟哟tv| 野花日本大全免费观看3中文版| 99久久香蕉| 国产精品视频第一区二区三区| 精品久久久久久久久免费影院 | 日本熟妇乱妇熟色A片蜜桃| 亚洲AV无码专区国产乱码网站| 伊人久久大香网| 操中国老太太| 黑丝美女娇喘| 欧美另类一区| 亚洲精品久久7777777| 99热久久这里只有精品视频| 国产精品久久大陆| 麻豆精品传媒卡一卡二传媒短视频 | 亚洲国产三级在线观看| 91黄色影院| 国产学生在线播放精品视频| 美美哒免费影视8| 小泽玛丽av无码观看| 67194在线入口免费| 国产婷婷色综合AV蜜臀AV| 男人的天堂色| 亚洲视频在线观看免费| 动漫护士被乳羞羞漫| 久久久国产精品免费A片3D| 神电影院午夜dy888我不卡|