一、对象流
- ObjectInputStream:对象字节输入流
- ObjectOutputStream:对象字节输出流
- 序列化(Serialize):Java对象存储到硬盘文件中。将Java对象的状态保存下来的过程。
- 反序列化(DeSerialize):将硬盘文件上的数据重新恢复到内存当中,恢复成Java对象。
注:参与序列化和反序列化的对象,必须实现Serializable接口,不然会出现 java.io.NotSerializableException:(对象不支持序列化)
- 通过源代码发现,Serializable接口只是一个标志接口,这个接口中什么代码都没有,它起到标识、标志的作用,Java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇。
————Serializable这个标志接口是给Java虚拟机参考的,Java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号。
public interface Serializable{ }
- 序列化的作用:
- Java语言中是采用什么机制来区分类的:
————对于Java虚拟机来说,Java虚拟机是可以区分两个类名相同且实现了Serializable接口的类,因为这两个类都实现了Serializable接口,都有默认的序列化版本号,它们的序列化版本号不一样,所有就能区分开了。(实现Serializable接口会自动生成序列化版本号)
- . 首先通过类名进行比对,如果类名不一样,肯定不是同一个类。
- . 如果类名一样,靠序列化版本号进行区分。
- 自动生成序列化版本号的缺陷:
- . 使用自动生成的序列化版本号,一旦代码确认之后,不能进行后续的修改。
————因为只要修改,就会重新编译,此时会生成一个全新的序列化版本号,这时Java虚拟机会认为这是一个全新的类,反序列化时就会出现异常。
- . 使用自动生成的序列化版本号,一旦代码确认之后,不能进行后续的修改。
- 序列化使用总结:
凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号,这样以后这个类即使代码修改了,但是序列化版本号不变,Java虚拟机会认为是同一个类。(案例如下)public class ArrayList<E> implements java.io.Serializable{ private static final long serialVersionUID = 8683452581122892189L; }
- Java语言中是采用什么机制来区分类的:
- 单个对象 序列化演示(ObjectOutputStream)和 反序列化演示(ObjectInputStream)
public class ObjectOutputStreamTest01 { public static void main(String[] args) { Student chensi = new Student(1111, "chensi"); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream