序列化:(将对象从内存存储到文件)
反序列化:(将对象从文件加载回内存)
1、将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化。
2、将一个对象保存到永久存储设备上称为持久化。
3、一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。
4、详细地说,序列化(Serialization)是把一个对象的状态写入一个字节流的过程。当想要把程序状态存到一个固定的存储区例如文件时,序列化是很管用的。之后就可以运用序列化过程存储这些对象。
5、一个类如果想被序列化,则需要实现java.io.Serializable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个实现了该接口,就表示这个泪点额对象是可以序列化的。
6、假设一个被序列化的对象引用了其他对象,同样,其他对象又引用了更多的对象。这以系列的对象和它们的关系形成了一个顺序图表。在这个对象图表中也有循环引用。也就是说,对象X可以含有一个对象Y的引用,对象Y同样可以包含一个对象X的引用。对象同样可以包含它们自己的引用。对象序列化和反序列化的工具被设计出来并在这一假定条件下运行良好。如果试图序列化一个对象图表中顶层的对象,所有的其他引用对象都被循环的定位和序列化。同样,在反序列化过程中,所有的这些对象以及它们的引用都被正确的恢复。
7、当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态成员变量。
8、如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
9、如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,该关键字表示变量不会被序列化,那么对象可以序列化。
10、只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。Serializable接口没有定义任何成员。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化。
11、声明为transient的变量不被序列化工具存储。同样,static变量也不被存储。
ObjectOutput接口
ObjectOutput继承DataOutput接口并且支持对象序列化。特别注意writeObject()方法,它被成为序列化一个对象。所有这些方法在出错情况下引发IOExcption异常。
ObjectOutputSream类
ObjectOutputSream类继承OutputSream类和实现ObjectOutput接口。它负责向流写入对象。它的构造方法参考API。
ObjectInput接口
ObjectInput接口继承DataInput接口。它支持对象序列化。特别注意readObject()方法返回的是Object类型,需要进行向下类型转换。
ObjectInputStream类
ObjectInputStream类继承InputStream类并实现ObjectInput接口。它负责从流中读取对象。详细构造方法参考API文档。
附:学序列化与反序列化,同时可以学习“装饰模式”的设计方式。