文章目录
一、序列化概述
1.1、什么是序列化?
序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。
1.2、为什么要序列化?
一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。
1.3、为什么不用java的序列化?
Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop 自己开发了一套序列化机制(Writable)
这里参照大佬文章演示 参考文章
对比java序列化和hadoop序列化
【1】java序列化
package com.zhou.MapReduce.Serialization.java;
import java.io.Serializable;
/**
* @author zhouhao
* @date 2021/8/15 - 22:19
*/
public class Student implements Serializable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.zhou.MapReduce.Serialization.java;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* @author zhouhao
* @date 2021/8/15 - 22:21
*/
public class Application {
public static void main(String[] args) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new Student("zhangsan", 20));
System.out.println("字节大小:" + baos.size());
oos.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行结果:
【2】hadoop序列化
package com.zhou.MapReduce.Serialization.hadoop;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import java