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