java.io.Serializable接口是一个标志性接口,在接口内部没有定义任何属性与方法。只是用于标识此接口的实现类可以被序列化与反序列化。
一、如何让某些属性不参与序列化与反序列化的过程?
如果一个属性被transient关键字修饰,那么此属性就不会参与对象序列化与反序列化的过程。
二、类的属性发生了增减那么反序列化时会有什么影响?
调用反序列化的方法,使用删除name属性之前的animal.dat文件进行反序列化,运行结果表时还是能正常的反序列化。由此可知,类的属性的增删并不能对对象的反序列化造成影响。
三、继承关系在序列化过程中的影响?
在继承关系中如果父类没有实现java.io.Serializable接口,那么在序列化子类时即使子类实现了java.io.Serializable接口也不能把父类中的属性序列化。
四、serialVersionUID属性
如果序列化之后修改了serialVersionUID属性,那么序列化的文件就不能再成功的反序列化。
当然,在工作中也见过很多程序员并不在意IDE警告,不会为类申明serialVersionUID属性,因为这个属性也不是必须的。通过把类的serialVersionUID属性删除也可以成功的序列化与反序列化,如果类没有显式的申明serialVersionUID属性,那么JVM会依据类的各方面信息自动生成serialVersionUID属性值,但是由于不同的JVM生成serialVersionUID的原理存在差异。所以强烈建议程序员显式申明serialVersionUID属性,并强烈建议使用private static final修饰此属性。
五、能否干预对象的序列化与反序列化过程?
对象的序列化与反序列化过程是完全可控的,利用writeReplace与writeObject方法控制序列化过程,readResolve与readObject方法控制反序列化过程。在序列化过程中与反序列化过程中方法的调用顺序如下所示:
序列化过程:writeReplace –> writeObject
反序列化过程:readObject –> readResolve