一、什么是序列化
數據在網絡間要進行通信,將數據結構或對象編碼,然后在網絡間傳輸就是序列化過程。
反之的解碼就是反序列化的過程。
附:
- POJO(Plain old java object),或者JavaBean,POJO只有setter和getter方法。
- IDL(interface description language)文件。參與通訊的各方需要對通訊的內容需要做相關的約定。IDL用來撰寫協議約定。
二、幾種常見的序列化和反序列化協議
1、XML&SOAP
- XML一種常用的序列化和反序列化協議。具有跨機器,跨語言等優點。
- SOAP(SIMPLE Object Access Protocol)是一種廣泛應用的,基於XML為序列化和反序列化協議的結構化消息傳遞協議。IDL是WSDL。在傳輸層的協議,SOAP最常見的使用方式XML+HTTP。
SOAP協議具有廣泛的群眾基礎。基於HTTP的傳輸協議使得其在穿越防火牆時有良好的安全特性。對於公司之間傳輸數據相對小或者實時性相對低的服務是個好選擇。但是數據量大的時候,內存和磁盤開銷比較大,因此不適合用XML。XML序列化和反序列化的開銷比較大,如果對於延時性較低的場景不適用。
2、JSON(Javascript Object Notation)
適用場景
- 數據量小,實時性相對較低的服務
- 居於Web brower的Ajax請求
- 由於JSON具有非常強的前后兼容性,對於接口經常變化,並對可調式性要求高的場景。
- 由於JSON的典型應用場景是JSON+HTTP,適合跨防火牆訪問。
3、Thrift
Thrift是Facebook開源提供的一個高性能,輕量級RPC服務框架,其產生正是為了滿足當前大數據量,分布式、跨語言、跨平台數據通訊的需求。但是Thrift並不僅僅是序列化協議,而是一個RPC框架。
適用場景
- 對於需求為高性能,分布式的RPC服務,Thrift是一個優秀的解決方案。它支持眾多語言和豐富的數據類型。
缺點,安全性是個問題。無法支持向持久層直接讀寫數據。所以不適合做數據持久化序列化協議
4、Protobuf
- 對工程師友好
- 序列化數據非常簡介、緊湊、與XML相比其序列化之后的數據量約為1\3到1\10。
- 解析速度非常塊
- 使用簡潔
5、Avro
有兩種序列化格式:Json或Binary格式。Binary格式在空間開銷和性能方面可媲美Protobuf。JSON格式目前是試驗階段。Avro在做文件持久化的時候,一般會和Schema一起存儲,所以Avro序列化文件自身具有自我描述屬性,所以非常適合於做Hive、Pig和MapReduce的持久化數據格式。
