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

wo0x00 文章内容

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

0x01 编写代码

1. 编写对象类

编写Block类

  1. package com.shaonaiyi.hadoop.serialize;
  2. import java.io.Serializable;
  3. /**
  4. * @Author shaonaiyi@163.com
  5. * @Date 2019/12/13 16:18
  6. * @Description 定义需要序列化的Block类
  7. */
  8. public class Block implements Serializable {
  9. private long blockId;
  10. private long numBytes;
  11. private long generationStamp;
  12. public Block(long blockId, long numBytes, long generationStamp) {
  13. this.blockId = blockId;
  14. this.numBytes = numBytes;
  15. this.generationStamp = generationStamp;
  16. }
  17. public long getBlockId() {
  18. return blockId;
  19. }
  20. public long getNumBytes() {
  21. return numBytes;
  22. }
  23. public long getGenerationStamp() {
  24. return generationStamp;
  25. }
  26. @Override
  27. public String toString() {
  28. return "Block{" +
  29. "blockId=" + blockId +
  30. ", numBytes=" + numBytes +
  31. ", generationStamp=" + generationStamp +
  32. '}';
  33. }
  34. }
2. 编写调用测试代码

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

  1. package com.shaonaiyi.hadoop.serialize;
  2. import java.io.*;
  3. /**
  4. * @Author shaonaiyi@163.com
  5. * @Date 2019/12/13 16:20
  6. * @Description 编写序列化与反序列化测试类代码
  7. */
  8. public class JavaSerializableTest {
  9. public static void main(String[] args) throws IOException, ClassNotFoundException {
  10. String fileName = "blockByte.txt";
  11. serialize(fileName);
  12. // deSerialize(fileName);
  13. }
  14. private static void serialize(String fileName) throws IOException {
  15. Block block = new Block(78062621L, 39447651L, 56737546L);
  16. File file = new File(fileName);
  17. if (file.exists()) {
  18. file.delete();
  19. }
  20. file.createNewFile();
  21. FileOutputStream fileOutputStream = new FileOutputStream(file);
  22. ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
  23. objectOutputStream.writeObject(block);
  24. objectOutputStream.close();
  25. }
  26. private static void deSerialize(String fileName) throws IOException, ClassNotFoundException {
  27. FileInputStream fileInputStream = new FileInputStream(fileName);
  28. ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
  29. Object object = objectInputStream.readObject();
  30. Block block = (Block)object;
  31. System.out.println(block);
  32. }
  33. }

0x02 测试结果

1. 测试序列化

a. 先把Block类的序列化代码删掉,调用序列化方法,执行发现报错!即删除 publicclassBlockimplementsSerializable{里的 implementsSerializable

b. 加回序列化代码,执行,发现项目与main文件夹同级目录下多了一个 blockbyte.txt文件,双击打开:  发现是乱码,因为此处是二进制的代码文件,但还是会有很多额外的信息的,比如说包名等等。

2. 测试反序列化

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

  1. // serialize(fileName);
  2. deSerialize(fileName);

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

3. 查看生成的文件大小

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

4. 测试修改对象代码

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

  1. public Block() {
  2. }

b. 然后再反序列化,发现已经没有办法反序列化了,这可不是我们想看到的。

0xFF 总结

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

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90189.html

(0)
guozi's avatarguozi
上一篇 2024年6月5日 下午1:57
下一篇 2024年6月5日 下午1:59

相关推荐

  • 如何设置万网虚拟主机的定时任务?

    你是否曾经为了定时任务的设置而烦恼?是否对万网虚拟主机的使用感到困惑?不用担心,本文将为你解答如何设置万网虚拟主机的定时任务。作为网络行业必不可少的一部分,万网虚拟主机在我们的日常…

    行业资讯 2024年3月20日
    0
  • 东莞网页设计

    随着互联网的发展,越来越多的企业开始关注云服务器。那么什么是云服务器呢?它有什么优势和应用场景?在东莞网页设计行业,云服务器又扮演着怎样的角色?让我们一起来探究一下! 什么是云服务…

    行业资讯 2024年3月24日
    0
  • 如何选择适合自己的韩国高防御服务器?

    你是否在选择服务器的过程中遇到困难?你是否想要拥有一台高防御性能强大的服务器?那么,韩国高防御服务器将是你的不二之选!韩国高防御服务器以其特有的优势备受行业关注。但是,如何选择适合…

    行业资讯 2024年3月27日
    0
  • 服务器虚拟化技术

    随着信息技术的快速发展,网络安全问题也日益凸显。针对这一挑战,服务器虚拟化技术应运而生。那么,什么是服务器虚拟化技术?它又如何在网络安全加速行业中发挥作用?它带来了哪些优势和挑战?…

    行业资讯 2024年3月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注