序列化就是把內存中的對象的狀態信息轉換成字節序列,以便於存儲(持久化)和網絡傳輸java
反序列化就是就將收到的字節序列或者是硬盤的持久化數據,轉換成內存中的對象。算法
1.JDK的序列化網絡
只要實現了serializable接口就能實現序列化與反序列化,必定要加上序列化版本ID serialVersionUID,這個是用來識別序列化的以前的類究竟是哪個。好比但願類的不一樣版本對序列化兼容,須要確保類的不一樣版本具備相同的serialVersionUID;框架
Java序列化算法須要考慮:oop
將對象實例相關的類元數據輸出。spa
遞歸地輸出類的超類描述直到再也不有超類。對象
類元數據完了以後,開始從最頂層的超類開始輸出對象實例的實際數據值遞歸
從上至下遞歸輸出實例的數據接口
因此java序列化很強大,序列化獲得的信息很詳細,可是序列化後很佔內存。內存
2.Hadoop序列化
相對於JDK比較簡潔,在急羣衆信息的傳遞主要就是靠這些序列化的字節樓來傳遞的,因此更快速度,容量更小。
hadoop序列化特色:
1.緊湊:帶寬是集羣中信息傳遞的最寶貴的資源因此咱們必須想法設法縮小傳遞信息的大小。
java序列化不夠靈活,爲了更好的控制序列化的整個流程因此使用Writable
java序列化會保存類的全部信息 依賴等,hadoop序列化不須要
2.對象可重用:JDK的反序列化會不斷地建立對象,這確定會形成必定的系統開銷,可是在hadoop的反序列化中,能重複的利用一個對象的readField方法來從新產生不一樣的對象。
java序列化每次序列化都要從新建立對象,內存消耗大。Writable能夠重用。
3.可拓展性
hadoop本身寫序列化很容易,能夠利用實現hadoop的Writable接口 實現了直接比較字符流以肯定兩個Writable對象的大小。
而java不是,java的序列化機制在每一個類的對象第一次出現的時候保存了每一個類的信息, 好比類名, 第二次出現的類對象會有一個類的reference, 致使空間的浪費
可使用開源的序列化框架protocol Buffers,Avro等框架
hadoop原生的序列化類須要實現一個叫Writeable的接口,相似於serializable接口
實現Writable接口必須實現兩個方法:write(DataOutputStream out);readField(DataInputStream in)方法。
YARN的序列化就是用Google開發的序列化框架protocol Buffers,proto目前支持支持三種語言C++,java,Python因此RPC這一層咱們就能夠利用其餘語言來作文章
Apache的Thrift和Google的Protocol Buffer也是比較流行的序列化框架,可是在Hadoop裏使用是有限的,只用於RPC和數據交互