Java 序列化(Serializable)
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型和信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据还有对象中的数据类型可以用来在内存中新建对象。
整个过程都是 JVM 独立的,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
类 ObjectOutputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
序列化满足条件:
- 该类实现 java.io.Serializable 接口
- 该类的所有属性必须是可序列化的,如果一个属性不是可序列化的,则该属性必须注明是短暂的
- 如果想知道一个 java 标准类是否可以序列化,只需查看该类有没有实现 java.io.Serializable 接口
代码实现
首先创建一个Student.java类并且集成 java.io.Serializable 接口
public class Student implements Serializable {
private String name;
private int age;
private String sex;
//省略有无参构造,get/set方法,toString方法
}
1. 序列化对象
ObjectOutputStream 类用来序列化一个对象,下面代码将 Student 对象序列化,并将该对象序列化到 d 盘 student.txt 文件中。
public class Test {
public static void main(String[] args) throws IOException {
Student student1 = new Student("张三", 20, "男");
Student student2 = new Student("李四", 20, "男");
Student student3 = new Student("王五", 20, "男");
FileOutputStream outFile = new FileOutputStream("d:/student.txt");
ObjectOutputStream out = new ObjectOutputStream(outFile);
out.writeObject(student1);
out.writeObject(student2);
out.writeObject(student3);
out.close();
outFile.close();
}
}
2. 反序列对象,将上面序列化完成的对象反序列化
public class Test2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream inFile = new FileInputStream("d:/student.txt");
ObjectInputStream in = new ObjectInputStream(inFile);
while (true){
try {
System.out.println(in.readObject());
}catch (Exception e){
break;
}
}
in.close();
inFile.close();
}
}
运行结果:
Student{name='张三', age=20, sex='男'}
Student{name='李四', age=20, sex='男'}
Student{name='王五', age=20, sex='男'}