image.png

序列化介绍

什么是序列化

序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。

为什么要序列化

一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。

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

image.png


Hadoop序列化机制的特点

① 紧凑:高效实用存储空间。
② 快速:读写数据的额外开销小。
③ 可扩展:随着通信协议的升级而可升级。
④ 互操作:支持多语言的交互。

Java序列化的不足

Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。

序列化效果对比

Java

  1. /**
  2. * Java中的序列化
  3. */
  4. public class JavaSerialize {
  5. public static void main(String[] args) throws Exception {
  6. //创建Student对象,并设置id和name属性
  7. StudentJava studentJava = new StudentJava();
  8. studentJava.setId(1L);
  9. studentJava.setName("Hadoop");
  10. //将Student对象的当前状态写入本地文件中
  11. FileOutputStream fos = new FileOutputStream("D:\\student_java.txt");
  12. ObjectOutputStream oos = new ObjectOutputStream(fos);
  13. oos.writeObject(studentJava);
  14. oos.close();
  15. fos.close();
  16. }
  17. }
  18. class StudentJava implements Serializable {
  19. private static final long serialVersionUID = 1L;
  20. private Long id;
  21. private String name;
  22. public Long getId() {
  23. return id;
  24. }
  25. public void setId(Long id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. }

image.png

Hadoop

  1. /**
  2. * Hadoop序列化机制
  3. */
  4. public class HadoopSerialize {
  5. public static void main(String[] args) throws Exception {
  6. //创建Student对象,并设置id和name属性
  7. StudentWritable studentWritable = new StudentWritable();
  8. studentWritable.setId(1L);
  9. studentWritable.setName("Hadoop");
  10. //将Student对象的当前状态写入本地文件中
  11. FileOutputStream fos = new FileOutputStream("D:\\student_hadoop.txt");
  12. ObjectOutputStream oos = new ObjectOutputStream(fos);
  13. studentWritable.write(oos);
  14. oos.close();
  15. fos.close();
  16. }
  17. }
  18. class StudentWritable implements Writable {
  19. private Long id;
  20. private String name;
  21. public Long getId() {
  22. return id;
  23. }
  24. public void setId(Long id) {
  25. this.id = id;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. @Override
  34. public void write(DataOutput out) throws IOException {
  35. out.writeLong(this.id);
  36. out.writeUTF(this.name);
  37. }
  38. @Override
  39. public void readFields(DataInput in) throws IOException {
  40. this.id = in.readLong();
  41. this.name = in.readUTF();
  42. }
  43. }

image.png