序列化Serializable和Externalizable的区别
???? 一般默认情况对对象进行序列化时会选择使用Serializable接口即可以了,而且Serializable接口不仅能序列化自己显示写进去的对象,而且会自动的追踪对象内的所包含的对象的引用,并且是迭代追踪的,省却了许多麻烦。
???? 不过如果在对象进行序列化时如果希望对对象的某些部分不被序列化(其实也可以用transient关键字解决)或者在对象被反序列化时希望某些子对象或属性可以重建的话,那么就可以用另一种序列化方式:实现Externalizable接口,即可方便的解决这些问题,下面对这两种方式分别举例说明:
???? SerializableTest.java:
????
????? ?上面的示例程序即时对serializable序列化机制的简单演示,其实serializable序列化实现是先将需要序列化的对象给转化成相应的二进制,然后存储到相应的硬盘设备或文件中,再反序列化时再完全以文件上的二进制位为基础构造出被序列化的对象,而不会涉及的对象的构造函数,数据均是从InputStream中获取的。
????? ?Externalizable序列化机制和Serializable有所不同,首先实现Externalizable接口必须要实现writeExternal(ObjectOutput out) 和void readExternal(ObjectInput in)两个方法,这两个方法分别在对象被序列化和反序列化时自动调用,可以从下面的示例中看出,而且Externalizable的反序列化和serializable不一样,它会在反序列化时调用对象的默认构造函数来创建这个对象,然后利用void readExternal(ObjectInput in)中的对相应的属性的进行初始化。如果没有该默认构造函数,会报错。
????? ExternalizableTest.java:
?
?? 程序运行结果如下:
???? ?Constructor called!
????? writeExtern finished!
????? default Constructor called!
????? readExternal finished!
???? 1:test??可以看出这两种序列化的一些区别。
?????