什么是序列化?
jvm中的一个对象,不是类,假如你想把一个对象,保存到磁盘上,必须序列化,你把文件中的对象进行恢复,是不是的反序列化。
假如你想把对象发送给另一个服务器,需要通过网络传输,也必须序列化,到另一侧要反序列化。
说到序列化,我们想到了Java的序列化。一个类实现了Serializable 接口即可。
Java对象什么时候需要序列化?
1)需要保存到本地的时候
2)需要在网络之间传输的时候
package com.bigdata;
import java.io.Serializable;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/8/1 11:43
* @Version 1.0
*/
public class User implements Serializable {
private String name;
private int 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;
}
}
大数据技术Hadoop并没有采用java的序列化机制,而是自己又整了一套自己的序列化机制。为什么?
Java的序列化携带的信息太多了,文件太大了,不便于在网络之间传输。
User 使用Java --> 100KB
User 使用大数据的序列化 --> 5KB
大数据采用的序列化机制是 Writable 接口。
为什么非得序列化呢?因为需要在网路之间传输。
Java数据类型 | Hadoop序列化的数据类型 | 释义 |
byte | ByteWritable | 字节类型 |
short | ShortWritable | 短整型 |
int | IntWritable | 整型 |
long | LongWritable | 长整型 |
float | FloatWritable | 单精度浮点型 |
double | DoubleWritable | 双精度浮点型 |
boolean | BooleanWritable | 布尔型 |
String | Text | 字符串 |
array | ArrayWritable | 数组 |
Map | MapWritable | Map |
null | NullWritable | 空 |
java的八大基本数据类型: byte short int long float double char boolean
只需要记住:String --> Text即可。null --> NullWritable,仅仅是为了在某个地方占位,符合语法而已。
2、测试java序列化 VS Hadoop序列化大小比较
java序列化
package com.bigdata;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private int age;
public User(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;
}
}
Hadoop的序列化
package com.bigdata;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class UserWritable implements Writable {
private String name;
private int age;
public UserWritable(String name, int age) {
this.name = name;
this.age = age;
}
// 序列化
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(name);
out.writeInt(age);
}
// 反序列化
@Override
public void readFields(DataInput in) throws IOException {
// 进行反序列化的时候,读取的顺序一定要跟序列化的时候的顺序一致,否则报错
name = in.readUTF();
age = in.readInt();
}
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.bigdata;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class TestXLH {
public static void main(String[] args) throws Exception {
User user = new User("zhangsan",20);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:/user1.txt"));
objectOutputStream.writeObject(user);
objectOutputStream.close();
UserWritable user2 = new UserWritable("zhangsan",20);
ObjectOutputStream objectOutputStream2 = new ObjectOutputStream(new FileOutputStream("D:/user2.txt"));
// 此时是序列化对象去write 对象流,此处需要注意
user2.write(objectOutputStream2);
objectOutputStream2.close();
}
}
java序列化的结果:
hadoop序列化的结果: