在Java编程中,我们经常需要将Java对象存储在硬盘或网络传输中,但是Java对象的内存中表示方式与硬盘和网络传输中的字节流不同,因此需要一种方法将Java对象转换成字节流,这就是序列化的作用。
Java中提供了Serializable接口来标识一个类可以序列化(即可以将对象转换成字节流),只有实现Serializable接口的类才可以进行序列化操作。
public class Student implements Serializable {
private String name;
private int age;
private String sex;
}
Java序列化操作需要用到ObjectOutputStream类,该类具有将Java对象转换成字节流的功能,以下是一个简单的序列化示例。
Student student = new Student();
student.setName("Tom");
student.setAge(20);
student.setSex("Male");
FileOutputStream fos = new FileOutputStream("student.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(student);
oos.close();
fos.close();
在以上代码中,我们将一个Student对象写入了一个名为“student.ser”的文件中,该文件中存储了该对象的字节流形式,以便后续可以进行反序列化操作。
反序列化操作是将字节流转换成Java对象的过程,Java中提供了ObjectInputStream类来实现反序列化操作,需要注意的是,反序列化的对象必须是实现Serializable接口的对象。
FileInputStream fis = new FileInputStream("student.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Student student = (Student)ois.readObject();
ois.close();
fis.close();
以上代码将从文件“student.ser”中读取字节流,并将其转换成一个Student对象。
需要注意的是,Java序列化和反序列化操作中使用的对象必须是同一类,否则将会出现异常,因此在进行序列化和反序列化操作时,我们需要了解被操作的类是否实现Serializable接口。