0
点赞
收藏
分享

微信扫一扫

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

泠之屋 2022-01-31 阅读 225



文章目录


  • ​​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​

Java的序列化与反序列化实操_大数据

b. 加回序列化代码,执行,发现项目与main文件夹同级目录下多了一个​​blockbyte.txt​​文件,双击打开:

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

发现是乱码,因为此处是二进制的代码文件,但还是会有很多额外的信息的,比如说包名等等。

2. 测试反序列化

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

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

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

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

3. 查看生成的文件大小

a. 可以看到blockByte文件大小是120字节

Java的序列化与反序列化实操_大数据_04

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

4. 测试修改对象代码

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

public Block() {

}

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

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

0xFF 总结


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

全栈工程师、市场洞察者、专栏编辑

| ​​公众号​​​ | ​​微信​​​ | ​​微博​​ | ​​简书​​ |

福利:

​​邵奈一的技术博客导航​​

​​邵奈一​​ 原创不易,如转载请标明出处。


举报

相关推荐

0 条评论