《这个真的可以会》——Serializable接口的作用

在定义实体类时,通常实现Serializable接口

《这个真的可以会》——Serializable接口的作用

Serializable接口是启用其序列化功能的接口。
实现java.io.Serializable 接口的类是可序列化的。
没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。

我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,
由具体的数据类型帮助我们实现了序列化操作。

如果有人打开过Serializable接口的源码,
就会发现,这个接口其实是个空接口,那么这个序列化操作,
到底是由谁去实现了呢?其实,看一下接口的注释说明就知道,
当我们让实体类实现Serializable接口时,
其实是在告诉JVM此类可被序列化,可被默认的序列化机制序列化。

serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

什么是序列化

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

序列化和反序列化

1、把对象转换为字节序列的过程称为对象的序列化
2、把字节序列恢复为对象的过程称为对象的反序列化

什么情况下需要序列化

当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化

那为什么还要继承Serializable。那是存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。

Serializable的声明

If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java™ Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class–serialVersionUID fields are not useful as inherited members. Array classes cannot declare an explicit serialVersionUID, so they always have the default computed value, but the requirement for matching serialVersionUID values is waived for array classes.

机翻
如果可序列化类没有显式地声明serialVersionUID,那么序列化运行时将根据类的各个方面计算该类的默认serialVersionUID,如Java™对象序列化规范中所述。然而,强烈推荐,所有可序列化的类显式地声明serialVersionUID的价值观,因为默认的serialVersionUID对于class的细节非常敏感,有可能在反序列化时发生 InvalidClassException 异常。因此,要保证不同java编译器实现之间的serialVersionUID值一致,可序列化类必须声明显式的serialVersionUID值。还强烈建议显式的serialVersionUID声明尽可能使用private修饰符,因为这样的声明只应用于当前类——serialVersionUID字段作为继承成员是没有用的。数组类不能显式的声明serialVersionUID,因此它们始终具有默认的计算值,但数组类无需匹配serialVersionUID值。

参考自:
[1] 面试官:连Serializable都不知道是什么,你这5年都干些什么了?
[2] Serializable接口的意义和用法