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

Like (0)
guozi的头像guozi
Previous 2024年6月5日
Next 2024年6月5日

相关推荐

  • 云服务器建立个人网站需要多少费用?

    云服务器建立个人网站需要多少费用?这是许多想要拥有自己网站的人都关心的问题。随着互联网的普及,每个人都可以轻松拥有一个属于自己的网站,但是在建设过程中,如何选择合适的云服务器却是一…

    行业资讯 2024年4月5日
    0
  • 如何下载和安装Windows 7补丁包?

    Windows 7补丁包是指针对Windows 7操作系统发布的一系列修复程序,它可以解决系统漏洞、增强系统功能以及提高系统性能。对于使用Windows 7的用户来说,安装补丁包是…

    行业资讯 2024年4月11日
    0
  • 如何选择最适合你的美国服务器?

    在当今网络时代,网络安全问题已经成为人们关注的焦点。而在网络安全加速行业中,选择一台适合自己的服务器显得尤为重要。然而,面对众多的美国服务器选择,如何才能选出最适合自己的那一款?本…

    行业资讯 2024年3月25日
    0
  • 如何优化服务器配置软件?

    如何优化服务器配置软件?什么是服务器配置软件?为什么需要优化服务器配置软件?如何评估服务器配置软件的性能?优化服务器配置软件的方法和技巧。这些问题都是我们在网络安全加速行业中经常遇…

    行业资讯 2024年4月18日
    0

发表回复

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