1. 程式人生 > >序列化和反序列化系列部落格(一)—— What and Why?

序列化和反序列化系列部落格(一)—— What and Why?

引言:

序列化和反序列化幾乎是工程師們每天都要面對的事情,但是要精確掌握這兩個概念並不容易:一方面,它們往往作為框架的一部分出現而湮沒在框架之中;另一方面,它們會以其他更容易理解的概念出現,例如加密、持久化。然而,序列化和反序列化的選型卻是系統設計或重構一個重要的環節,在分散式、大資料量系統設計裡面更為顯著。恰當的序列化協議不僅可以提高系統的通用性、強健性、安全性、優化系統性能,而且會讓系統更加易於除錯、便於擴充套件。

Why?

  1. 巨集觀上來說:

    網際網路的產生帶來了機器間通訊的需求,而互聯通訊的雙方需要採用約定的協議,序列化和反序列化屬於通訊協議的一部分。通訊協議往往採用分層模型,不同模型每層的功能定義以及顆粒度不同,例如:TCP/IP協議是一個四層協議,而OSI模型卻是七層協議模型。在OSI七層協議模型中展現層(Presentation Layer)的主要功能是把應用層的物件轉換成一段連續的二進位制串,或者反過來,把二進位制串轉換成應用層的物件–這兩個功能就是序列化和反序列化。
    一般而言,TCP/IP協議的應用層對應與OSI七層協議模型的應用層,展示層和會話層,所以序列化協議屬於TCP/IP協議應用層的一部分。本文對序列化協議的講解主要基於OSI七層協議模型。

  2. 微觀上來說:

    資料結構、物件與二進位制串上的差異:

      不同的計算機語言中,資料結構,物件以及二進位制串的表示方式並不相同。

      資料結構和物件:對於類似Java這種完全面向物件的語言,工程師所操作的一切都是物件(Object),來自於類的例項化。在Java語言中最接近資料結構的概念,就是POJO(Plain Old Java Object)或者Javabean--那些只有setter/getter方法的類。而在C++這種半面向物件的語言中,資料結構和struct對應,物件和class對應。
      二進位制串:序列化所生成的二進位制串指的是儲存在記憶體中的一塊資料。C++語言具有記憶體操作符,所以二進位制串的概念容易理解,例如,C++語言的字串可以直接被傳輸層使用,因為其本質上就是以’\0’結尾的儲存在記憶體中的二進位制串。在Java語言裡面,二進位制串的概念容易和String混淆。實際上String 是Java的一等公民,是一種特殊物件(Object)。對於跨語言間的通訊,序列化後的資料當然不能是某種語言的特殊資料型別。二進位制串在Java裡面所指的是byte[],byte是Java的8中原生資料型別之一(Primitive data types)。

小結:

所謂的序列化和反序列化,定義總結如下:

序列化: 將資料結構或物件轉換成二進位制串的過程
反序列化:將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程

為啥要進行序列化和反序列化操作?簡單總結一句話:

由於不同的計算機語言中,資料結構,物件以及二進位制串的表示方式並不相同,所以,為了保證不同的物理機器間通訊能夠正常和順利進行,我們規定相互連線並且通訊的雙方必須在表示層和應用層的資料相互傳輸過程中進行序列化和反序列化操作。