1.序列化简介
(1)什么是序列化
序列化就是把内存中的对象,转换成字节序列(或其他的据传输协议)方便存储(持久化的)到磁盘中和网络传输
反序列化就是将收到的字节序列转换成内存中的对象
(2)为什么要序列化
在工作当中,"正在运行"的对象只能在内存里,断电关机后就不会继续运行或者存在,而且只能在本地的进程中使用们不能被发送到网络上的另一台计算机上.而序列化可以存储"正在运行"对象,并且可以发送到远程计算机上
(3)为什么不用java序列化
java序列化可以理解为是一个非常重量级序列化框架(Serializable),当一个对象被序列化后同时会携带大量的额外的信息(校验信息,Header,继承体等),不方便在网络中高效的传输使用,Hadoop序列化(Writable)解决了这一问题
(4)Hadoop序列化特点:
1)紧凑 :高效使用存储空间。
2)快速:读写数据的额外开销小。
3)互操作:支持多语言的交互
自定义bean对象实现序列化接口(Writable)
在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在Hadoop框架内部传递一个bean对象,那么该对象就需要实现序列化接口。
具体实现bean对象序列化步骤如下7步。
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
public 类名() {
super();
}
(3)重写序列化方法
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}
(4)重写反序列化方法
@Override
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),可用"t"分开,方便后续用。
(7)如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序。
@Override
public int compareTo(FlowBean o) {
// 倒序排列,从大到小
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}



