Serializable:
首先Serializable是完全序列化,并且记录字段值在构造器中的修改,在反序列化时,先将该类的字段初始化,然后将序列化流
中所得数据分配给字段。如果一个类实现了Serializable,但他的父类并不是可序列化的,那么该父类必须要有个无参构造函数。
此情况下,反序列化的顺序是先调用父类无参构造函数。实现Serializable的类中的字段如有对象,那么该对象也需实现Serializable
关于private void writeObject(ObjectOutputStream o) private void readObject(ObjectInputStream o),前者在序列化对象时调用,后
者在反序列化对象时调用,在父类无参构造函数调用之后。
Externalizable:
实现此接口的类必须实现public void writeExternal(ObjectOutput out)与public void readExternal(ObjectInput in).此类必须有个公有无参构造函数以便在反序列化时调用,并且在反序列化时,是直接将字段恢复成原值(注意)。如果在一个带参构造函数并且在此构造函数中修改了字段值,若想要保存此字段新值,那么就要在Externalzable的接口中明确地写入(因为在反序列化时只会调用到无参构造)。实现Externalzable的类中的字段如有对象,此对象不需实现Externalizable或者Serializable。
全面性地看了下序列化,得出了这么多结论,真搞不懂Serializable与Externalizable还搞这么多的区别,大家一起看看还有啥遗漏的~或者有什么错误的地方~呵呵,谢谢了!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【qiandongbo】截止到2008-06-23 13:30:48的历史汇总数据(不包括此帖):
    发帖数:6                  发帖分:220                
    结贴数:6                  结贴分:220                
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

    Externalizable主要可以在 Serializable基础上做一些自定义的操作 
      

  3.   

    对象被序列化时,被该对象引用的实例变量也会序列化。所有的引用对象也会序列化(整个对象版图都会)。
    类必须实现Serializable才能序列化(否则会在运行时异常)
    Transient String id; 标记的变量可以不需要序列化(执行时得到的变量,网络联机等),还原后得到的是默认值;
    还原的时候,新对象会被配置在heap上,但构造函数不会执行!
    Static不会被序列化;
    serialVersionID:对象被序列化时的版本id,如果在解序列化时id变化,还原失败。不是所有对类的修改都会破坏还原(比如加入新变量)
      

  4.   

    对象序列化主要是用来在远程机器上也运行一个与本机完全一样的对象实现Externalizable接口的对象自己负责自己的序列化