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的头像guozi
上一篇 2024年6月5日
下一篇 2024年6月5日

相关推荐

  • 网站如何防止恶意攻击,如何防止网站被入侵

    互联网的发展给我们带来了便利,但也带来了安全隐患。随着网络攻击越来越频繁,如何保护网站的安全成为每个网站管理员必须面对的问题。选择合适的安全设备来防止网站受到攻击是解决这一问题的关…

    行业资讯 2024年5月8日
    0
  • 如何通过seo建站提高网站排名?

    如果你是一个网站管理员,相信你一定想要知道如何通过SEO建站来提高网站的排名。那么,什么是SEO建站?为什么它如此重要?通过优化网站内容和结构,我们可以达到什么样的效果?接下来,让…

    行业资讯 2024年4月17日
    0
  • 怎样恢复服务器

    服务器故障是网络安全加速行业中常见的问题,它会导致企业的数据丢失、业务中断等严重后果。因此,当服务器发生故障时,如何快速恢复服务器成为了每个企业都必须面对的挑战。那么,你知道什么是…

    行业资讯 2024年4月9日
    0
  • gpu服务器的作用及使用方法详解

    你是否听说过GPU服务器?它是一种令人惊叹的技术,可以为我们带来前所未有的计算体验。它不仅能够提供强大的计算能力,还可以在多个领域发挥作用。那么,你知道GPU服务器的作用是什么吗?…

    行业资讯 2024年4月1日
    0

发表回复

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