1. 序列化与反序列化
-
对象写出到文件,称为序列化,ObjectOutputStream
-
对象从硬盘文件中读取,称为反序列化,ObjectInputStream
反序列化需要读取已序列化的文件,所以序列化为写出,反序列化为读取。
- 实体类想要能被序列化,必须实现Serializable接口(序列化接口),否则报NotSerializableException异常。
2. 序列版本号ID
- 要想反序列化时能正确读取到数据,序列版本ID必须与序列化时产生的ID一致,否则报InvalidClassException异常。
2.1 自定义serialVersionUID:
static final long serialVersionUID是固定写法,权限修饰符4大权限都行,long类型数字可自定义。
private static final long serialVersionUID = 1L;
2.2 IDEA生成序列版本号:
2.2.1 在Settings中搜索并勾选:Serializable class without 'serialVersionUID'
2.2.2 鼠标悬停在类名上,然后点击:Add 'serialVersionUID' field
3. 代码
3.1 测试类
package serializable.demo01;
import java.io.*;
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
writeObj();
readObj();
}
// 序列化
public static void writeObj() throws IOException{
FileOutputStream fos = new FileOutputStream("D:\\1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new Person("张三",18));
oos.close();
}
// 反序列化
public static void readObj() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("D:\\1.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
// Person obj = (Person)ois.readObject();
Object obj = ois.readObject();
ois.close();
System.out.println(obj);
}
}
3.2 Person类
package serializable.demo01;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 9021306722359178667L;
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}