1. 程式人生 > >網路程式設計中的序列化和反序列化

網路程式設計中的序列化和反序列化

原創:美圖技術團隊 http://tech.meituan.com/serialization_vs_deserialization.html

個人總結:

protobuf,1)序列化後的資料量更小,是xml的1/3~1/10;

2)效能更好,解析速度是xml的20~100倍;

3)缺點是序列化後的資料,人眼不可讀,不方便除錯。

json,1)有javascript的先天支援,廣泛用於web瀏覽器應用;

2)關聯陣列的特性使其有很好的相容性和擴充套件性,適合介面經常變化的場景;

3)json大部分情況下可以取代xml,比xml更小,更快,更易解析;

4)適合資料量相對不大,實時性相對要求不高,而對可調式性有高要求的情況。

原文部分內容:

JSON(Javascript Object Notation)

JSON起源於弱型別語言Javascript, 它的產生來自於一種稱之為"Associative array"的概念,其本質是就是採用"Attribute-value"的方式來描述物件。實際上在Javascript和PHP等弱型別語言中,類的描述方式就是Associative array。JSON的如下優點,使得它快速成為最廣泛使用的序列化協議之一:
1、這種Associative array格式非常符合工程師對物件的理解。
2、它保持了XML的人眼可讀(Human-readable)的優點。
3、相對於XML而言,序列化後的資料更加簡潔。 來自於的以下連結的研究表明:XML所產生序列化之後檔案的大小接近JSON的兩倍。

http://www.codeproject.com/Articles/604720/JSON-vs-XML-Some-hard-numbers-about-verbosity
4、它具備Javascript的先天性支援,所以被廣泛應用於Web browser的應用常景中,是Ajax的事實標準協議。
5、與XML相比,其協議比較簡單,解析速度比較快。
6、鬆散的Associative array使得其具有良好的可擴充套件性和相容性。

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

JSON在很多應用場景中可以替代XML,更簡潔並且解析速度更快。典型應用場景包括:
1、公司之間傳輸資料量相對小,實時性要求相對低(例如秒級別)的服務。
2、基於Web browser的Ajax請求。
3、由於JSON具有非常強的前後相容性,對於介面經常發生變化,並對可調式性要求高的場景,例如Mobile app與服務端的通訊。
4、由於JSON的典型應用場景是JSON+HTTP,適合跨防火牆訪問。

Protobuf

Protobuf具備了優秀的序列化協議的所需的眾多典型特徵:
1、標準的IDL和IDL編譯器,這使得其對工程師非常友好。
2、序列化資料非常簡潔,緊湊,與XML相比,其序列化之後的資料量約為1/3到1/10。
3、解析速度非常快,比對應的XML快約20-100倍。
4、提供了非常友好的動態庫,使用非常簡介,反序列化只需要一行程式碼。

Protobuf是一個純粹的展示層協議,可以和各種傳輸層協議一起使用;Protobuf的文件也非常完善。 但是由於Protobuf產生於Google,所以目前其僅僅支援Java、C++、Python三種語言。另外Protobuf支援的資料型別相對較少,不支援常量型別。由於其設計的理念是純粹的展現層協議(Presentation Layer),目前並沒有一個專門支援Protobuf的RPC框架。

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

Protobuf具有廣泛的使用者基礎,空間開銷小以及高解析效能是其亮點,非常適合於公司內部的對效能要求高的RPC呼叫。由於Protobuf提供了標準的IDL以及對應的編譯器,其IDL檔案是參與各方的非常強的業務約束,另外,Protobuf與傳輸層無關,採用HTTP具有良好的跨防火牆的訪問屬性,所以Protobuf也適用於公司間對效能要求比較高的場景。由於其解析效能高,序列化後資料量相對少,非常適合應用層物件的持久化場景。

它的主要問題在於其所支援的語言相對較少,另外由於沒有繫結的標準底層傳輸層協議,在公司間進行傳輸層協議的除錯工作相對麻煩。