Serializable 接口–java.io.serializable

来源:互联网 发布:mysql中的级联删除 编辑:程序博客网 时间:2024/06/05 10:49

转自:http://blog.csdn.net/w627782664/article/details/7064338

Serializable 接口–java.io.serializable

  • 作用:类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
  • 实现了此接口的类有:String, Integer, Boolean, Long, ArrayList, List, File 等等。
  • 当java内存有一个对象的时候,我们想把它持久化保存起来,以后又可以从保存的数据中恢复成对象,这种情况经常在java中出现;sun公司为了方便实现这种功能,为用户提供了java.io.Serializable这个接口,这个接口中没有方法(又称为mini接口);
  • 在java编译器编译的时候对这种mini接口的对象进行特殊的编译,如果你的对象实现了serializable接口,那么就可以通过另一个工具ObjectOutputStream的方法writeObject(obj)来存储对象,而不需要具体知道存储该对象的具体细节;
  • 当恢复对象的时候,便可以通过ObjectInputStream.readObject(obj)来恢复对象;
  • 由于对于文件的存储目标是未知的,可以是硬盘也可以是网络上的某个主机,故ObjectInputStream和ObjectOutputStream并不是直接操作硬盘,也不是直接操作网络,而是操作可以直接访问物理设备的流的对象,如FileInputStream和FileOutputStream,即ObjectInputStream和ObjectOutputStream可以将直接进行底层操作的流FileInputStream和FileOutputStream包装起来,形成包装类,或者叫包装流;
  • 在形成包装类之后,对于需要保存的对象,先由包装类的外层将该对象转换为二进制字节,再将这些字节传递给内层可以直接进行物理设备操作的流如FileOutputStream,通过底层流保存到物理设备;
  • 包装的思想:首先,有个物理设备,如硬盘或网络,在内存中会有个流,如FileOutputStream,这个流只能有个write(byte[])方法,该方法写的是字节。而现在要将一个对象写入物理设备,故需要一个类来进行对象到字节的转换,这个转换类就是ObjectInputStream和ObjectOutputStream,通过这两个类转换,将转换后的字节数据交给FileOutputStream来进行物理设备操作。简单地说,就是一个分层的思想,也是“各尽其责”的思想。对象保存到物理设备,这个过程由两层完成,上层只负责将对象转换成字节数据,下层只负责将接收到的字节写入物理设备。
  • 所以包装流(如ObjectOutputStream)并不真正连接到底层物理设备,它起到一个中转的作用,因此它的构造方法一定要传递给它一个与底层设备相关的流,前者是把数据转换完了交给后者去读写物理设备;对于物理设备是什么设备,包装流并不知道,只有传递给它的底层设备相关的流(如FileOutputStream)知道。

0 0
原创粉丝点击