
序列化介绍
什么是序列化
序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。
为什么要序列化
一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。
Hadoop的序列化机制Writable
常用的Writable实现类
| Java基本类型 | Writable | 序列化大小(字节) |
|---|---|---|
| 布尔型(boolean) | BooleanWritable | 1 |
| 字节型(byte) | ByteWritable | 1 |
| 整型(int) | IntWritable VIntWritable |
4 1~5 |
| 浮点型(float) | FloatWritable | 4 |
| 长整型(long) | LongWritable VLongWritable |
8 1~9 |
| 双精度浮点型(double) | DoubleWritable | 8 |

Hadoop序列化机制的特点
① 紧凑:高效实用存储空间。
② 快速:读写数据的额外开销小。
③ 可扩展:随着通信协议的升级而可升级。
④ 互操作:支持多语言的交互。
Java序列化的不足
Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。
序列化效果对比
Java
/*** Java中的序列化*/public class JavaSerialize {public static void main(String[] args) throws Exception {//创建Student对象,并设置id和name属性StudentJava studentJava = new StudentJava();studentJava.setId(1L);studentJava.setName("Hadoop");//将Student对象的当前状态写入本地文件中FileOutputStream fos = new FileOutputStream("D:\\student_java.txt");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(studentJava);oos.close();fos.close();}}class StudentJava implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Hadoop
/*** Hadoop序列化机制*/public class HadoopSerialize {public static void main(String[] args) throws Exception {//创建Student对象,并设置id和name属性StudentWritable studentWritable = new StudentWritable();studentWritable.setId(1L);studentWritable.setName("Hadoop");//将Student对象的当前状态写入本地文件中FileOutputStream fos = new FileOutputStream("D:\\student_hadoop.txt");ObjectOutputStream oos = new ObjectOutputStream(fos);studentWritable.write(oos);oos.close();fos.close();}}class StudentWritable implements Writable {private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(this.id);out.writeUTF(this.name);}@Overridepublic void readFields(DataInput in) throws IOException {this.id = in.readLong();this.name = in.readUTF();}}

