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 + '}'; } }
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 测试结果
a. 先把Block类的序列化代码删掉,调用序列化方法,执行发现报错!
即删除public class Block implements Serializable {
里的implements Serializable
b. 加回序列化代码,执行,发现项目与main文件夹同级目录下多了一个blockbyte.txt
文件,双击打开:
发现是乱码,因为此处是二进制的代码文件,但还是会有很多额外的信息的,比如说包名等等。
a. 打开反序列化方法,执行:
// serialize(fileName); deSerialize(fileName);
发现可以将Block对象反序列化出来了。
a. 可以看到blockByte文件大小是120字节
但是,我们定义的Block类,其实只有24个字节。Long类是8个字节,三个Long类型的属性是24个字节,120与24比较,其实生成的文件已经大了很多了。
a. 尝试修改Block类,如在里面添加一个无参数的构造方法
public Block() { }
b. 然后再反序列化,发现已经没有办法反序列化了,这可不是我们想看到的。
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |
福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。