Java对象流与序列化

来源:互联网 发布:2017淘宝男装店铺排行 编辑:程序博客网 时间:2024/06/03 15:41

Java的序列化机制是RMI、EJB等技术的技术基础。      

所有的类必须通过实现Serializable接口来实现序列化的功能,Serializable接口没有任何方法,因此你不需要对这些类做任何改动。


----为什么叫序列化

       readObject()函数从ObjectInputStream中读入一个对象。特别是,这个方法会读回对象的类,类的签名以及这个类及其超类中所有非静态和非瞬时的域的值,它执行的反序列允许恢复多个对象引用。--这说明了transient [ˈtrænziənt] 的变量不能被序列化。static的变量也不能序列化。


----修改默认的序列化机制

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException

private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException

看下ArrayList是如何实现的序列化和反序列化的:




       上述两个方法只需要保存和加载它们的数据域,而不需要关心超类数据和任何其他类的信息。除了让序列化机制来保存和恢复对象数据,类还可以定义自己的机制。为了做到这一点,这个类必须实现Externalizable接口,这需要她定义两个方法:

public void writeExternal(java.io.ObjectOutputStream s) throws java.io.IOException

public void readExternal(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException

       与上述的的方法不同的是,这了两个方法要负责对包括超类数据在内的整个对象的存储和恢复负全责,而序列化机制在类中仅仅只是记录该对象所属于的类。在读入可外部化的类时,对象流将用无参构造器创建一个对象,然后调用readExternal方法。


----序列化单例

       为了解决这个问题,你需要定义另外一个被称为readResolve的特殊序列化方法。如果定义了readResolve方法,在对象被序列化之后就会调用它。它必须返回一个对象,而该对象之后会成为readObject的返回值。