据说Java的默认序列化机制不太高效,因为a)它通过反射发现要写入/读取的字段,这通常很慢;b)它向流中写入额外的数据。
使其更加高效的一种方法是实现Externalizable接口及其writeExternal/readExternal方法。
问题在于:如果我提供了writeObject/readObject方法,并且在其中没有调用defaultWriteObject/defaultReadObject,那么该机制将不使用反射来确定要写入/读取的字段,并且它也不会向流中写入额外数据(或者会吗?不确定)。因此,从效率的角度来看,实现上述writeObject/readObject是否与实现Externalizable相同?或者后者给出了前者没有的一些实际好处吗?
编辑: 当可序列化类实现readObject/writeObject时被子类化时,如果子类有自己的readObject/writeObject,则它们不需要调用父类的readObject/writeObject。如果超类/子类代替实现Externalizable,则情况并非如此。在这种情况下,必须显式调用超类的writeExternal/readExternal。然而,从效率的角度来看,这种区别是无关紧要的。
使其更加高效的一种方法是实现Externalizable接口及其writeExternal/readExternal方法。
问题在于:如果我提供了writeObject/readObject方法,并且在其中没有调用defaultWriteObject/defaultReadObject,那么该机制将不使用反射来确定要写入/读取的字段,并且它也不会向流中写入额外数据(或者会吗?不确定)。因此,从效率的角度来看,实现上述writeObject/readObject是否与实现Externalizable相同?或者后者给出了前者没有的一些实际好处吗?
编辑: 当可序列化类实现readObject/writeObject时被子类化时,如果子类有自己的readObject/writeObject,则它们不需要调用父类的readObject/writeObject。如果超类/子类代替实现Externalizable,则情况并非如此。在这种情况下,必须显式调用超类的writeExternal/readExternal。然而,从效率的角度来看,这种区别是无关紧要的。