什么是序列化与反序列化
序列化:
说白了,就是把一个实现了Serializable接口(只有实现了这个接口的类才能被序列化与反序列化)的类去变成本地文件保存。
反序列化:
说白了,就是把上面保存的本地文件,一般保存为.ser后缀名的文件,通过对象输入流,给加载到内存里面去
几个与序列化、反序列化相关的对象
一、关于序列化的对象
说明一下:
ObjectOutputStream,这个一般考虑为把一个对象写入到指定流里面,它的构造函数里面传递的是一个OutputSream流,也就是说,里面可以传入本地的字节输出流比如FileOutputStream,然后把这个对象写入到本地文件中。序列化就可以采用这种操作
另外就是,我们还可以把这个对象写入到ByteArrayOutputStream流中,这个对象里面维护了一个自动增长的缓冲数组。
二、关于反序列化的对象
其实就是上面介绍对象的输入流,因为要把文件输入到内存中
说明一下:上面的ObjectInputStream对象的构造方法中,是传入一个字节输入流对象的,一般反序列化我们是从本地找文件,也就是利用FileInputStream来获取文件,然后解析。但是也可以传入一个ByteArrayInputStream流,这个里面就会传入一个之前放到ByteArrayOutputStream流中的byte数组,然后可以拿过来解析
备注:不想被序列化的属性可以用transient关键字进行修饰
序列化与反序列化的具体操作
序列化,直接上操作代码
Serialization1.java
package pxx;
import java.io.*;
public class Serialization1 {
public static void main(String[] args) {
Person person = new Person("张三丰",20,180);
//直接采用try-with-resources
try (FileOutputStream fis = new FileOutputStream("D:\\person.ser");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fis)){
objectOutputStream.writeObject(person);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
现在去看在D盘生成的文件
这个文件你不用打开看,打开也看不懂,只有通过反序列化解析出来才能看
下面再来进行反序列化操作
Deserialization1.java
package pxx;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Deserialization1 {
public static void main(String[] args) throws IOException {
Person person = null;
try ( FileInputStream fis = new FileInputStream("D:\\person.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(fis)){
person = (Person)objectInputStream.readObject();
System.out.println(person);//直接打印出来
} catch (FileNotFoundException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:
好了,说到这,祝早安午安晚安。