1. 概述java
序列化(Serialization)是指把結構化對象轉化爲字節流。網絡
反序列化(Deserialization)是序列化的逆過程。把字節流轉爲結構化對象。框架
當要在進程間傳遞對象或持久化對象的時候,就須要序列化對象成字節流,反之當要將接收到或從磁盤讀取的字節流轉換爲對象,就要進行反序列化。ide
Java的序列化(Serializable)是一個重量級序列化框架,一個對象被序列化後,會附帶不少額外的信息(各類校驗信息,header,繼承體系…),不便於在網絡中高效傳輸;因此,hadoop本身開發了一套序列化機制(Writable),精簡,高效。不用像java對象類同樣傳輸多層的父子關係,須要哪一個屬性就傳輸哪一個屬性值,大大的減小網絡傳輸的開銷。oop
Writable是Hadoop的序列化格式,hadoop定義了這樣一個Writable接口。code
一個類要支持可序列化只需實現這個接口便可。對象
2. void write(DataOutput out) throws IOException; 排序
3. void readFields(DataInput in) throws IOException; 繼承
2. Writable序列化接口接口
如須要將自定義的bean放在key中傳輸,則還須要實現comparable接口,由於mapreduce框中的shuffle過程必定會對key進行排序,此時,自定義的bean實現的接口應該是:
public class FlowBean implements WritableComparable<FlowBean>
須要本身實現的方法是:
/** * 反序列化的方法,反序列化時,從流中讀取到的各個字段的順序應該與序列化時寫出去的順序保持一致 */ @Override public void readFields(DataInput in) throws IOException { upflow = in.readLong(); dflow = in.readLong(); sumflow = in.readLong(); } /** * 序列化的方法 */ @Override public void write(DataOutput out) throws IOException { out.writeLong(upflow); out.writeLong(dflow); out.writeLong(sumflow); } @Override public int compareTo(FlowBean o) { //實現按照sumflow的大小倒序排序 return sumflow>o.getSumflow()?-1:1; }
compareTo方法用於將當前對象與方法的參數進行比較。
若是指定的數與參數相等返回0。
若是指定的數小於參數返回 -1。
若是指定的數大於參數返回 1。
例如:o1.compareTo(o2);
返回正數的話,當前對象(調用compareTo方法的對象o1)要排在比較對象(compareTo傳參對象o2)後面,返回負數的話,放在前面。