JAVA序列化/反序列化理解
理解JAVA序列化和序列化:(重点)
首先明确什么是序列化,为何要序列化:无论任何类型数据,在网络上传输都是以二进制的形式,为了将JAVA对象传输到另一个进程中,需要把其转换为字节序列才能在网络上传输(把JAVA对象转为字节序列的过程成为对象序列化,将字节序列转为JAVA对象成为反序列化)。
序列化运行时使用一个称为serialVersionUID的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接受者是否为该对象加载了与序列化兼容的类。如果接受者加载的该对象serialVersionUID号与发送者中serialVersionUID号不同,则反序列化将导致异常(InvalidClassException)。可序列化类可以通过声明名为serialVersionUID的字段显示声明自己的版本号。
重点:
如果可序列化类没有显示声明serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认serialVersionUID值。不过强烈建议自己显示声明,原因是在计算serialVersionUID对类的详情信息具体较高的敏感性,根据编辑器实现的不同可能千差万别,这样在范徐列过程中可能会导致以外的InvalidClassException。因此为保证seriaVersionUID值跨不同JAVA编辑器实现的一致性,序列化必须声明一个明确的seriaVersionUID值,并且强烈建议使用private私有化该值,这种值只用于此类作为立即声明,serialVersionUID字段作为继承成员是没有意义的。