《这个真的可以会》——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接口的意义和用法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值