序列化定义
序列化: ---------为了保留对象状态
- 1.对象的序列化(serialize)指将一个Java对象写入IO流中,对象的反序列化机制(Deserialize)则指从IO流中恢复该Java对象.
- 如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化的(实现Serialize接口或者Externalizable接口)
一.使用对象流实现序列化
ObjectOutputStream oos=new ObjectOutputStream( new FileOutputStream("..."));//输出流(处理流)
oos.writeObject(new Object())//对象输出到输出流中
二.使用对象流反序列化
ObjectInputStream ois=new ObjectInputStream( new FileInputStream("..."));//输入流
Object obj=ois.readObject();//从IO流中读取该Java对象,完成反序列化机制
transient关键字只能用于修饰属性,不可修饰Java中其他成分.
Writable接口
Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可序列化对象,这些对象都实现了 Writable 接口, Writable 接口是序列化对象的一个通用接口。
Writable接口抽象了两个序列化的方法Write和ReadFields,分别对应了序列化和反序列化,参数DataOutPut 为java.io包内的IO类,Writable接口只是对象序列化的一个简单声明。
public interface Writable{
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOException;
}
WritableComparable接口
WriteCompareable接口是Wirtable接口的二次封装,提供了compareTo(T o)方法,用于序列化对象的比较的比较,下面是io包简单的类图关系。
代码实现
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* @Author: Stephen
* @Date: 2019/12/10 9:09
* @Content:
*/
public class Student implements WritableComparable {
private long stuid;
private String stuname;
private int score;
public long getStuid() {
return stuid;
}
public void setStuid(long stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public int compareTo(Object o) {
return 0;
}
@Override
public void write(DataOutput dataOutput) throws IOException {
/**
* 写入即可实现序列化
* 写入的顺序及是读取的顺序
*/
dataOutput.writeLong(stuid);
dataOutput.writeUTF(stuname);
dataOutput.writeInt(score);
}
@Override
public void readFields(DataInput dataInput) throws IOException {
/**
* 反序列化读取数据
*/
this.stuid = dataInput.readLong();
this.stuname = dataInput.readUTF();
this.score = dataInput.readInt();
}
@Override
public String toString() {
return "Student{" +
"stuid=" + stuid +
", stuname='" + stuname + '\'' +
", score=" + score +
'}';
}
public Student() {
}
public Student(long stuid, String stuname, int score) {
this.stuid = stuid;
this.stuname = stuname;
this.score = score;
}
}