【美團】序列化與反序列化

 

1、序列化組件與數據庫訪問組件的對比

 

 

序列化組件 數據庫組件 說明
IDL DDL 用於建表或者模型的語言
DL file DB Schema 表建立文件或模型文件
Stub/Skeleton lib O/R mapping 將class和Table或者數據模型進行映射

 

2、JSON(Javascript Object Notation)

JSON起源於弱類型語言Javascript, 它的產生來自於一種稱之爲"Associative array"的概念,其本質是就是採用"Attribute-value"的方式來描述對象。javascript

實際上在Javascript和PHP等弱類型語言中,類的描述方式就是Associative array。JSON的以下優勢,使得它快速成爲最普遍使用的序列化協議之一:html

(1)、這種Associative array格式很是符合工程師對對象的理解。java

(2)、它保持了XML的人眼可讀(Human-readable)的優勢。數據庫

(3)、相對於XML而言,序列化後的數據更加簡潔。 來自於的如下連接的研究代表:XML所產生序列化以後文件的大小接近JSON的兩倍。json

(4)、它具有Javascript的先天性支持,因此被普遍應用於Web browser的應用常景中,是Ajax的事實標準協議。app

(5)、與XML相比,其協議比較簡單,解析速度比較快。性能

(6)、鬆散的Associative array使得其具備良好的可擴展性和兼容性。大數據

IDL悖論

JSON實在是太簡單了,或者說太像各類語言裏面的類了,因此採用JSON進行序列化不須要IDL。這實在是太神奇了,存在一種自然的序列化協議,自身調試

就實現了跨語言和跨平臺。然而事實沒有那麼神奇,之因此產生這種假象,來自於兩個緣由:htm

(1)Associative array在弱類型語言裏面就是類的概念,在PHP和Javascript裏面Associative array就是其class的實際實現方式,因此在這些弱類型語言

裏面,JSON獲得了很是良好的支持。

(2)IDL的目的是撰寫IDL文件,而IDL文件被IDL Compiler編譯後可以產生一些代碼(Stub/Skeleton),而這些代碼是真正負責相應的序列化和反序列化

工做的組件。 可是因爲Associative array和通常語言裏面的class太像了,他們之間造成了一一對應關係,這就使得咱們能夠採用一套標準的代碼進行相應的

轉化。對於自身支持Associative array的弱類型語言,語言自身就具有操做JSON序列化後的數據的能力;對於Java這強類型語言,能夠採用反射的方式統

一解決,例如Google提供的Gson。

典型應用場景和非應用場景

JSON在不少應用場景中能夠替代XML,更簡潔而且解析速度更快。典型應用場景包括:

(1)公司之間傳輸數據量相對小,實時性要求相對低(例如秒級別)的服務。

(2)基於Web browser的Ajax請求。

(3)因爲JSON具備很是強的先後兼容性,對於接口常常發生變化,並對可調式性要求高的場景,例如Mobile app與服務端的通信。

(4)因爲JSON的典型應用場景是JSON+HTTP,適合跨防火牆訪問。

總的來講,採用JSON進行序列化的額外空間開銷比較大,對於大數據量服務或持久化,這意味着巨大的內存和磁盤開銷,這種場景不適合。

(1)沒有統一可用的IDL下降了對參與方的約束,實際操做中每每只能採用文檔方式來進行約定,這可能會給調試帶來一些不便,延長開發週期。

(2)因爲JSON在一些語言中的序列化和反序列化須要採用反射機制,因此在性能要求爲ms級別,不建議使用。

 

出處:

美團:序列化和反序列化

相關文章
相關標籤/搜索