Hadoop的序列化与反序列化实操

简介: Hadoop的序列化与反序列化实操

0x00 文章内容


  1. 编写代码
  2. 测试结果


0x01 编写代码


前提:因为需要用到Hadoop,所以需要先引入Hadoop相关的jar包

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.5</version>
</dependency>


image.png


1. 编写对象类

a. 编写Block类

package com.shaonaiyi.hadoop.serialize;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:51
 * @Description 定义引入Hadoop序列化机制的BlockWritable类
 */
public class BlockWritable implements Writable {
    private long blockId;
    private long numBytes;
    private long generationStamp;
    public BlockWritable(long blockId) {
        this.blockId = blockId;
    }
    public BlockWritable(long blockId, long numBytes, long generationStamp) {
        this.blockId = blockId;
        this.numBytes = numBytes;
        this.generationStamp = generationStamp;
    }
    public long getBlockId() {
        return blockId;
    }
    public long getNumBytes() {
        return numBytes;
    }
    public long getGenerationStamp() {
        return generationStamp;
    }
    @Override
    public String toString() {
        return "Block{" +
                "blockId=" + blockId +
                ", numBytes=" + numBytes +
                ", generationStamp=" + generationStamp +
                '}';
    }
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeLong(blockId);
        dataOutput.writeLong(numBytes);
        dataOutput.writeLong(generationStamp);
    }
    public void readFields(DataInput dataInput) throws IOException {
        this.blockId = dataInput.readLong();
        this.numBytes = dataInput.readLong();
        this.generationStamp = dataInput.readLong();
    }
}


2. 编写调用测试代码

a. 编写序列化与反序列化代码

package com.shaonaiyi.hadoop.serialize;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableFactories;
import java.io.*;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:53
 * @Description 编写Hadoop序列化机制测试类代码
 */
public class HadoopSerializableTest {
    public static void main(String[] args) throws IOException {
        String fileName = "blockWritable.txt";
        serialize(fileName);
//        deSerialize(fileName);
    }
    private static void serialize(String fileName) throws IOException {
        BlockWritable block = new BlockWritable(78062621L, 39447651L, 56737546L);
        File file = new File(fileName);
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
        block.write(dataOutputStream);
        dataOutputStream.close();
    }
    private static void deSerialize(String fileName) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(fileName);
        DataInputStream dataInputStream = new DataInputStream(fileInputStream);
        Writable writable = WritableFactories.newInstance(BlockWritable.class);
        writable.readFields(dataInputStream);
        System.out.println((BlockWritable)writable);
    }
}


0x02 测试结果


1. 测试序列化

a. 执行序列化方法,发现项目与main文件夹同级目录下多了一个blockWritable.txt文件,双击打开:

image.png


查看大小,发现是24字节:


image.png


我们定义的BlockWritable类,Long类是8个字节,三个Long类型的属性是24个字节,没有引入额外的信息,是我们想要的结果,请与上一篇教程做比较:Java的序列化与反序列化实操

2. 测试反序列化

a. 打开反序列化方法,执行:


//        serialize(fileName);
        deSerialize(fileName);


image.png


发现可以将BlockWritable对象反序列化出来了。

3. 测试修改对象代码

a. 尝试修改BlockWritable类,如在里面添加一个无参数的构造方法


    public BlockWritable() {
    }


b. 然后再反序列化,发现执行的结果并没有报错,与前面一样。


image.png


0xFF 总结


  1. Hadoop的序列化机制解决了内置的Java序列化接口的缺陷。
  2. 本教程拥有前置教程:Java的序列化与反序列化实操
  3. Hadoop的序列化机制接口如下:


image.png


在平时代码中,可以参考如下:


 Text text = new Text();
 String word = "hello";
 text.set(word);
 IntWritable intWritable = new IntWritable(3);
相关文章
|
2月前
|
存储 安全 Java
Java一分钟之-Java序列化与反序列化
【5月更文挑战第14天】Java序列化用于将对象转换为字节流,便于存储和网络传输。实现`Serializable`接口使类可被序列化,但可能引发隐私泄露、版本兼容性和性能问题。要避免这些问题,可使用`transient`关键字、控制`serialVersionUID`及考虑使用安全的序列化库。示例代码展示了如何序列化和反序列化对象,强调了循环引用和未实现`Serializable`的错误。理解并妥善处理这些要点对优化代码至关重要。
36 1
|
24天前
|
存储 Java
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
|
27天前
|
JSON Java API
jackson序列化和反序列化中的注解和扩展点大全【收藏】
jackson序列化和反序列化中的注解和扩展点大全【收藏】
|
29天前
|
存储 JSON 数据库
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
|
1月前
|
网络协议 Java API
【Java】序列化和反序列化
【Java】序列化和反序列化
21 4
|
1月前
|
存储 分布式计算 算法
|
1月前
|
Java 数据安全/隐私保护 Android开发
Java基础21-读懂Java序列化和反序列化(二)
Java基础21-读懂Java序列化和反序列化(二)
99 1
|
1月前
|
XML 存储 Java
Java基础21-读懂Java序列化和反序列化(一)
Java基础21-读懂Java序列化和反序列化(一)
22 1
|
1月前
|
JSON 缓存 Java
【Java基础】 序列化和反序列化
Java中的序列化(Serialization)和反序列化(Deserialization)是将对象和字节流之间进 行相互转换的过程。这两个过程用于保存对象的状态并能够在需要时恢复这些状态。
19 1
|
27天前
|
存储 Java 数据库
Java中序列化与反序列化详解
Java中序列化与反序列化详解
15 0

相关实验场景

更多