Java教程

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

本文主要是介绍Java的序列化与反序列化实操,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 0x00 文章内容
  • 0x01 编写代码
          • 1. 编写对象类
          • 2. 编写调用测试代码
  • 0x02 测试结果
          • 1. 测试序列化
          • 2. 测试反序列化
          • 3. 查看生成的文件大小
          • 4. 测试修改对象代码
  • 0xFF 总结

0x00 文章内容
  1. 编写代码
  2. 测试结果
0x01 编写代码
1. 编写对象类

a. 编写Block类

package com.shaonaiyi.hadoop.serialize;

import java.io.Serializable;

/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:18
 * @Description 定义需要序列化的Block类
 */
public class Block implements Serializable {

    private long blockId;
    private long numBytes;
    private long generationStamp;

    public Block(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 +
                '}';
    }

}
2. 编写调用测试代码

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

package com.shaonaiyi.hadoop.serialize;

import java.io.*;

/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:20
 * @Description 编写序列化与反序列化测试类代码
 */

public class JavaSerializableTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        String fileName = "blockByte.txt";
        serialize(fileName);
//        deSerialize(fileName);

    }

    private static void serialize(String fileName) throws IOException {
        Block block = new Block(78062621L, 39447651L, 56737546L);

        File file = new File(fileName);
        if (file.exists()) {
            file.delete();
        }

        file.createNewFile();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(block);
        objectOutputStream.close();

    }

    private static void deSerialize(String fileName) throws IOException, ClassNotFoundException {

        FileInputStream fileInputStream = new FileInputStream(fileName);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        Object object = objectInputStream.readObject();
        Block block = (Block)object;
        System.out.println(block);
    }

}
0x02 测试结果
1. 测试序列化

a. 先把Block类的序列化代码删掉,调用序列化方法,执行发现报错!
即删除public class Block implements Serializable {里的implements Serializable
在这里插入图片描述
b. 加回序列化代码,执行,发现项目与main文件夹同级目录下多了一个blockbyte.txt文件,双击打开:
在这里插入图片描述
发现是乱码,因为此处是二进制的代码文件,但还是会有很多额外的信息的,比如说包名等等。

2. 测试反序列化

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

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

在这里插入图片描述
发现可以将Block对象反序列化出来了。

3. 查看生成的文件大小

a. 可以看到blockByte文件大小是120字节
在这里插入图片描述
但是,我们定义的Block类,其实只有24个字节。Long类是8个字节,三个Long类型的属性是24个字节,120与24比较,其实生成的文件已经大了很多了。

4. 测试修改对象代码

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

    public Block() {

    }

b. 然后再反序列化,发现已经没有办法反序列化了,这可不是我们想看到的。
在这里插入图片描述

0xFF 总结
  1. 内置的Java序列化接口是有缺陷的,会写入额外的信息。第一,会使得数据大小膨胀;第二,只要稍微改动一下代码就无法兼容,无法反序列化。两种情形上面都已经演示了,不是我们想要的结果。
  2. 下一篇引入Hadoop的序列化机制,以弥补Java内置的序列化接口的缺陷。请点击跳转!

作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。


这篇关于Java的序列化与反序列化实操的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!