目錄
- 一、引入前提
- 二、選擇哪種序列化實現
- 2.1、選擇哪種序列化實現需要權衡的幾個因素
- 2.2、如何選擇哪種序列化實現
- 三、實現高性能的序列化和反序列化
- 四、小結
本文來源:極客時間vip課程筆記
一、引入前提
- 在 TCP 的連接上,它傳輸數據的基本形式就是二進制流,也就是一段一段的 1 和 0。在一般編程語言或者網絡框架提供的 API 中,傳輸數據的基本形式是字節,也就是 Byte。一個字節就是 8 個二進制位,8 個 Bit,所以在這里,二進制流和字節流本質上是一樣的。
- 那對于我們編寫的程序來說,它需要通過網絡傳輸的數據是什么形式的呢?是結構化的數據,比如,一條命令、一段文本或者是一條消息。對應到我們寫的代碼中,這些結構化的數據是什么?這些都可以用一個類(Class)或者一個結構體(Struct)來表示。
- 那顯然,要想使用網絡框架的 API 來傳輸結構化的數據,必須得先實現結構化的數據與字節流之間的雙向轉換。這種將結構化數據轉換成字節流的過程,我們稱為序列化,反過來轉換,就是反序列化。
- 序列化的用途除了用于在網絡上傳輸數據以外,另外的一個重要用途是,將結構化數據保存在文件中,因為在文件內保存數據的形式也是二進制序列,和網絡傳輸過程中的數據是一樣的,所以序列化同樣適用于將結構化數據保存在文件中。
- 很多處理海量數據的場景中,都需要將對象序列化后,把它們暫時從內存轉移到磁盤中,等需要用的時候,再把數據從磁盤中讀取出來,反序列化成對象來使用,這樣不僅可以長期保存不丟失數據,而且可以節省有限的內存空間。
二、選擇哪種序列化實現
- 如果說,只是實現序列化和反序列的功能,并不難,方法也有很多,比如我們最常使用的,把一個對象轉換成字符串并打印出來,這其實就是一種序列化的實現,這個字符串只要轉成字節序列,就可以在網絡上傳輸或者保存在文件中了。
- 但是,你千萬不要在你的程序中這么用,這種實現的方式僅僅只是能用而已,絕不是一個好的選擇。
- 有很多通用的序列化實現,我們可以直接拿來使用。Java 和 Go 語言都內置了序列化實現,也有一些流行的開源序列化實現,比如,Google 的 Protobuf、Kryo、Hessian 等;此外,像 JSON、XML 這些標準的數據格式,也可以作為一種序列化實現來使用。
- 當然,我們也可以自己來實現私有的序列化實現。
2.1、選擇哪種序列化實現需要權衡的幾個因素
- 序列化后的數據最好是易于人類閱讀的;
- 實現的復雜度是否足夠低;
- 序列化和反序列化的速度越快越好;
- 序列化后的信息密度越大越好,也就是