wo0x00 文章内容
- 编写代码
- 测试结果
0x01 编写代码
1. 编写对象类
编写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. 编写调用测试代码
编写序列化与反序列化代码
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类的序列化代码删掉,调用序列化方法,执行发现报错!即删除 publicclassBlockimplementsSerializable{
里的 implementsSerializable
b. 加回序列化代码,执行,发现项目与main文件夹同级目录下多了一个 blockbyte.txt
文件,双击打开: 发现是乱码,因为此处是二进制的代码文件,但还是会有很多额外的信息的,比如说包名等等。
2. 测试反序列化
打开反序列化方法,执行:
// serialize(fileName);
deSerialize(fileName);
发现可以将Block对象反序列化出来了。
3. 查看生成的文件大小
可以看到blockByte文件大小是120字节 但是,我们定义的Block类,其实只有24个字节。Long类是8个字节,三个Long类型的属性是24个字节,120与24比较,其实生成的文件已经大了很多了。
4. 测试修改对象代码
a. 尝试修改Block类,如在里面添加一个无参数的构造方法
public Block() {
}
b. 然后再反序列化,发现已经没有办法反序列化了,这可不是我们想看到的。
0xFF 总结
- 内置的Java序列化接口是有缺陷的,会写入额外的信息。第一,会使得数据大小膨胀;第二,只要稍微改动一下代码就无法兼容,无法反序列化。两种情形上面都已经演示了,不是我们想要的结果。
- 下一篇我们将讲解如何引入Hadoop的序列化机制,以弥补Java内置的序列化接口的缺陷。
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90189.html