JDK1.8Serializable接口详解

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值