序列化与反序列化
概念:
Java语言中存在一种机制,在这种机制中通过将Java对象转换字节序列。字节序列中保存了对象的信息,对象数据,以及对象保存的数据的类型。
整个序列化和反序列化都是在Java虚拟机JVM上进行了。所以将一个对象序列化之后,在其他不同的平台完全可以进行反序列化。
ObjectInputStream和ObjectOutputStream类
这两个类都是高层次的数据流类,用于对象数据的读写,所以其中包含序列化对象和反序列化对象方法。
这两个方法都要保证序列化的对象是可以被序列化的
所以要被序列化的对象必须实现了java.io.Serializable的接口。
序列化的对象到文件时,按照Java的标准是一个后缀为.ser的文件。
代码测试
package com.zjg.redisSpring;
import java.io.*;
public class SerDemo {
static class Zjg implements Serializable {
private String name;
private int age;
private int sex;
public Zjg(){
super();
}
@Override
public String toString() {
return "Zjg{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}
static void serObject(Zjg zjg){
try {
FileOutputStream fileOutputStream = new FileOutputStream("E:\\learn\\learnTest\\zjg.ser");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(zjg);
objectOutputStream.close();
fileOutputStream.close();
System.out.println("完成序列化");
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
static void reSerObject(){
try {
FileInputStream fileInputStream = new FileInputStream("E:\\learn\\learnTest\\zjg.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Zjg obj = (Zjg)objectInputStream.readObject();//readObject方法返回的结果是Object基类,要进行强转。
//输出测试
System.out.println("反序列化后的对象内容::"+obj);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
Zjg zjg = new Zjg();
zjg.age = 21;
zjg.sex = 1;
zjg.name = "zjg";
//对象序列化
serObject(zjg);
reSerObject();
}
}
控制台结果::
完成序列化
反序列化后的对象内容::Zjg{name=‘zjg’, age=21, sex=1}
Process finished with exit code 0