一、序列化和反序列化的定义
序列化:将对象转化为字节序列的过程称为对象的序列化。
反序列化:将字节序列转化为对象的过程转化为对象的反序列化。
明确来说,序列化主要运用于两种场景,一种是把对象的状态存储到磁盘文件,另一种是在网络传输中,把对象转化为字节序列进行传送。
序列化有两种实现方式,一种是被序列化类实现Serializable接口,另一种是实现 Externalizable接口, Externalizable接口继承自Serializable接口。Serializable接口采用默认的序列化方式,如果字段是其它对象,那么其它对象也要被序列化,如果其它对象还引用另外对象,那么另外对象也要被序列化,以此类推。 Externalizable接口有两个方法writeExternal(ObjectOutput out)和readExternal(ObjectInput in),要实现这两个方法,自定义序列化哪个字段。
二、Serializable接口
创建实体类Person,实现Serializable接口
public class Person implements Serializable {
private String name;
private int age;
private String sex;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
序列化和反序列化Person类对象
public class SerializeAndDeserialize {
public static void main(String[] args) throws IOException, ClassNotFoundException {
serialize();
Person person = deserialize();
System.out.println(person);
}
private static void serialize() throws IOException {
Person person = new Person();
person.setName("小明");
person.setAge(20);
person.setSex("男");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("E:/person.txt")));
objectOutputStream.writeObject(person);
objectOutputStream.close();
}
private static Person deserialize() throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("E:/person.txt")));
Person person = (Person)objectInputStream.readObject();
return person;
}
}
运行结果:
在E盘生成person.txt文件,并把person对象序列化到person.txt文件,读取person.txt文件,反序列化为person对象并打印。