什么是Serializable接口
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才可以被序列化。打开Serializable接口源码,里面什么都没有。
什么是序列化和反序列化
序列化是将对象状态转换为可保持或传输的字节流的过程。与序列化相对的是反序列化,它将字节流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
为什么要序列化
- 存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。
- 便于数据传输,尤其是在远程调用的时候!
Serializable接口怎样工作
Serializable是一个空接口,那怎样工作呢?Serializable仅仅作为一个标识符的作用,通过该接口让JVM识别,并将其进行序列化。在反序列化的过程中则需要使用serialVersionUID来确定由那个类来加载这个对象,所以我们在实现Serializable接口的时候,一般还会要去尽量显示地定义serialVersionUID,如:
private static final long serialVersionUID = 1L;
如果我们在序列化中没有显示地声明serialVersionUID,则序列化运行时将会根据该类的各个方面计算该类默认的serialVersionUID值。但是,Java官方强烈建议所有要序列化的类都显示地声明serialVersionUID字段,因为如果高度依赖于JVM默认生成serialVersionUID,可能会导致其与编译器的实现细节耦合,这样可能会导致在反序列化的过程中发生意外的InvalidClassException异常。因此,为了保证跨不同Java编译器实现的serialVersionUID值的一致,实现Serializable接口的必须显示地声明serialVersionUID字段。
此外serialVersionUID字段地声明要尽可能使用private关键字修饰,这是因为该字段的声明只适用于声明的类,该字段作为成员变量被子类继承是没有用处的!有个特殊的地方需要注意的是,数组类是不能显示地声明serialVersionUID的,因为它们始终具有默认计算的值,不过数组类反序列化过程中也是放弃了匹配serialVersionUID值的要求。
资料:https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc