序列化和反序列化的概念
- 序列化:将java对象以字节流的形式存储在硬盘的过程。序列化可以将数据永久的保存在磁盘上(通常保存在文件中)
- 反序列化:将保存在磁盘文件中的java字节码重新转换成java对象称为反序列化
序列化的优点
能够将java对象持久的保存在硬盘上,即使JVM关闭了对象也不会丢失,当想再次使用时,只需要进行反序列化就行
序列化和反序列化的实现
- 首先将需要序列化的类继承Serializable接口标识该类可序列化
- 使用ObjectOutputStream对象中的writeObject方法将Java对象写到指定的路径中去。
- 使用ObjectInputStream对象中的readObject方法从指定的路径读取对象到内存中来。
public class Main {
public static void main(String[] args) throws Exception {
User user=new User(18,"张三");
ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("dx.txt"));
oos.writeObject(user);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dx.txt"));
User user1 = (User) ois.readObject();
System.out.println(user1);
oos.close();
ois.close();
}
}
class User implements Serializable{
private int age;
private String name;
public User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
运行结果
User{age=18, name='张三'}
若不想某些变量被序列化可以使用transient关键字
public class Main {
public static void main(String[] args) throws Exception {
User user=new User(18,"张三");
ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("dx.txt"));
oos.writeObject(user);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dx.txt"));
User user1 = (User) ois.readObject();
System.out.println(user1);
oos.close();
ois.close();
}
}
class User implements Serializable{
private transient int age;
private String name;
public User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
运行结果
User{age=0, name='张三'}